#include <math.h> // <cmath> en C++
double scalbn( double value, int exp ); // C99
float scalbnf( float value, int exp ); // C99
long double scalbnl( long double value, int exp ); // C99
Ces trois fonctions multiplient la première valeur passée en paramètre par FTL_RADIX
élevé à la puissance spécifiée par le second paramètre
(scalbn(value,exp) = value * FTL_RADIXexp
).
FLT_RADIX
est définie dans l'entête <float.h>
.
Sur la plupart des plateformes, FLT_RADIX
est égal à 2, ce qui rend cette fonction équivalente à ldexp
.
La différence entre ces trois fonctions réside dans le type de données utilisé pour le paramètre et la valeur de retour (double, float ou long double).
De plus, il existe trois autres variantes (scalbln, scalblnf,scalblnl
) qui diffèrent par le fait qu'elles acceptent
un second paramètre typé long
plutôt que int
.
FLT_RADIX
exp..
FLT_RADIX
.
Ces fonctions renvoient x *
.
FLT_RADIX
exp
Si la magnitude de x est trop grande (en fonction du type considéré) une valeur HUGE_VAL
(ou
HUGE_VALF
ou HUGE_VALL
, en fonction du type de x
) sera produite
et la variable errno
sera initialisée à la valeur ERANGE
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <float.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> int main( int argc, char * argv[] ) { // On initialise le générateur de nombres pseudo aléatoire // avec le timestamp courant. srand ( time ( NULL)); // On calcule une valeur aléatoire de type double entre [1, 10[. double value = ( rand() / (double) RAND_MAX ) * 10; // On invoque la fonction scalbn pour quelques puissances de FLT_RADIX. for( int e=0; e<10; e++ ) { double result = scalbn( value, e ); printf( "%g * FLT_RADIX ^ %d == %g\n", value, e, result ); } // Pour information, on affiche FLT_RADIX printf( "FLT_RADIX == %d\n", FLT_RADIX ); return EXIT_SUCCESS; } |
Il est à noter que la librairie mathématique doit être ajoutée durant l'étape de "link" (édition des liens) de votre exécutable.
Cela se réalise en ajoutant l'option -lm
à votre compilateur GCC. En cas d'utilisation d'un autre compilateur, je vous renvoie vers la documentation de ce dernier.
$> gcc -o sample sample.c -lm $> ./sample 0.21925 * FLT_RADIX ^ 0 == 0.21925 0.21925 * FLT_RADIX ^ 1 == 0.438499 0.21925 * FLT_RADIX ^ 2 == 0.876998 0.21925 * FLT_RADIX ^ 3 == 1.754 0.21925 * FLT_RADIX ^ 4 == 3.50799 0.21925 * FLT_RADIX ^ 5 == 7.01599 0.21925 * FLT_RADIX ^ 6 == 14.032 0.21925 * FLT_RADIX ^ 7 == 28.0639 0.21925 * FLT_RADIX ^ 8 == 56.1279 0.21925 * FLT_RADIX ^ 9 == 112.256 FLT_RADIX == 2 $>
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :