Fonction de la bibliothèque C -ldexp()
Bibliothèque standard C - <math.h>
Description
Fonctions de la bibliothèque Cdouble ldexp(double x, int exponent)renvoiexfois 2 à laexposantpuissance.
ldexp()fait partie de la bibliothèque standard C<math.h>L'une des fonctions utilisées pour calculerx * 2^exp. Elle est généralement utilisée avecfrexp()Lorsqu'elles sont utilisées ensemble, les parties significande et exposant d'un nombre à virgule flottante sont recombinées en un nombre à virgule flottante. Cela est très utile dans les calculs numériques et les opérations avancées sur les nombres à virgule flottante.
Déclaration
Ci-dessous se trouve la déclaration de la fonction ldexp().
#include <math.h> double ldexp(double x, int exp); float ldexpf(float x, int exp); long double ldexpl(long double x, int exp);
Paramètre
xLe nombre à virgule flottante à combiner avec l'exposant.expL'exposant de base 2.
Valeur de retour
- return
x * 2^exp, avec le même type que l'entréexcohérent.
Exemple
L'exemple suivant démontre l'utilisation de la fonction ldexp().
Exemple
#include <math.h>
int main ()
{
double x, ret;
int n;
x = 0.65;
n = 3;
ret = ldexp(x ,n);
printf("%f * 2^%d = %f\n", x, n, ret);
return(0);
}
Compilons et exécutons le programme ci-dessus, ce qui produira le résultat suivant :
0.650000 * 2^3 = 5.200000
etfrexp()utilisé en combinaison
L'exemple suivant montre comment utiliserfrexp()etldexp()pour décomposer et reconstruire un nombre à virgule flottante :
Exemple
#include <math.h>
int main() {
double x = 123.456;
int exponent;
double mantissa = frexp(x, &exponent);
// Reconstruire le nombre à virgule flottante
double reconstructed_x = ldexp(mantissa, exponent);
printf("x d'origine = %f\n", x);
printf("Mantisse = %f, Exposant = %d\n", mantissa, exponent);
printf("x reconstruit = %f\n", reconstructed_x);
return 0;
}
Compilons et exécutons le programme ci-dessus, ce qui produira le résultat suivant :
Original x = 123.456000 Mantissa = 0.964500, Exponent = 7 Reconstructed x = 123.456000
Explication du code
- définir un nombre à virgule flottante
x, la valeur est 123.456. - Utilisation
frexp()vaxDécomposer en une mantisse et un exposant. - Utilisation
ldexp()Reconstruire le nombre à virgule flottante d'origine à partir de la significande et de l'exposant. - Afficher la valeur d'origine, la significande, l'exposant et le nombre à virgule flottante reconstruit.
Gestion des erreurs
ldexp()La fonction ne renvoie pas d'état d'erreur, mais dans certains cas, l'entrée peut provoquer un dépassement de capacité ou un sous-dépassement. Pour des résultats trop grands ou trop petits, l'infini positif, l'infini négatif ou zéro peuvent être renvoyés. En utilisant laisinf()etisnan()peut détecter ces conditions.
L'exemple suivant montre comment gérer les éventuelles conditions de débordement et de sous-dépassement :
Exemple
#include <math.h>
#include <errno.h>
int main() {
double x = 1.0;
int exponent = 1024;
double result = ldexp(x, exponent);
if (isinf(result)) {
printf("Débordement : ldexp(%f, %d) donne l'infini.\n", x, exponent);
} else if (result == 0.0 && errno == ERANGE) {
printf("Sous-dépassement : ldexp(%f, %d) donne zéro.\n", x, exponent);
} else {
printf("ldexp(%f, %d) = %f\n", x, exponent, result);
}
return 0;
}
Compilons et exécutons le programme ci-dessus, ce qui produira le résultat suivant :
Overflow: ldexp(1.000000, 1024) results in infinity.
Explication du code
- définir un nombre à virgule flottante
xet un très grand entierexponent。 - Appel
ldexp(x, exponent)Calculerx * 2^exponent, le résultat est stocké dansresultDans. - Utilisation
isinf()Vérifiez si le résultat est infini et gérez les cas de débordement. - Vérifiez si le résultat est zéro et gérez les cas de sous-dépassement.
- Afficher le résultat du calcul.
Résumé
ldexp()La fonction est utilisée pour calculerx * 2^expest un outil important pour le traitement des opérations en virgule flottante. Grâce à une utilisation raisonnéeldexp()permet d'obtenir une gestion efficace des nombres à virgule flottante en analyse numérique, en calcul scientifique et dans les applications d'ingénierie, en particulier lorsqu'il est nécessaire defrexp()lorsqu'elle est utilisée en combinaison avec la fonction.