ilogb, ilogbf, ilogbl
|
Défini dans l'en-tête
<math.h>
|
||
|
int
ilogbf
(
float
arg
)
;
|
(1) | (depuis C99) |
|
int
ilogb
(
double
arg
)
;
|
(2) | (depuis C99) |
|
int
ilogbl
(
long
double
arg
)
;
|
(3) | (depuis C99) |
|
Défini dans l'en-tête
<tgmath.h>
|
||
|
#define ilogb( arg )
|
(4) | (depuis C99) |
|
Défini dans l'en-tête
<math.h>
|
||
|
#define FP_ILOGB0 /* implementation-defined */
|
(5) | (depuis C99) |
|
#define FP_ILOGBNAN /* implementation-defined */
|
(6) | (depuis C99) |
ilogbl
est appelé. Sinon, si
arg
a un type entier ou le type
double
,
ilogb
est appelé. Sinon,
ilogbf
est appelé.
Formellement, l'exposant non biaisé est la partie entière de
log
r
|arg|
en tant que valeur entière signée, pour un
arg
non nul, où
r
est
FLT_RADIX
.
Table des matières |
Paramètres
| arg | - | valeur en virgule flottante |
Valeur de retour
Si aucune erreur ne se produit, l'exposant non biaisé de arg est renvoyé comme une valeur signée de type int.
Si arg est nul, FP_ILOGB0 est renvoyé.
Si arg est infini, INT_MAX est retourné.
Si arg est un NaN, FP_ILOGBNAN est renvoyé.
Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , la valeur de retour n'est pas spécifiée et une erreur de domaine ou une erreur de plage peut survenir.
Gestion des erreurs
Les erreurs sont signalées comme spécifié dans
math_errhandling
.
Une erreur de domaine ou de plage peut survenir si arg est zéro, infini ou NaN.
Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , une erreur de domaine ou une erreur de plage peut survenir
Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559),
- Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , FE_INVALID est déclenché.
- Si arg est ±0, ±∞, ou NaN, FE_INVALID est déclenché.
- Dans tous les autres cas, le résultat est exact ( FE_INEXACT n'est jamais déclenché) et le mode d'arrondi actuel est ignoré.
Notes
Si arg n'est pas zéro, infini ou NaN, la valeur retournée est exactement équivalente à ( int ) logb ( arg ) .
POSIX exige qu'une erreur de domaine se produise si arg est zéro, infini, NaN, ou si le résultat correct est en dehors de la plage de int .
POSIX exige également que, sur les systèmes conformes XSI, la valeur retournée lorsque le résultat correct est supérieur à INT_MAX soit INT_MAX et que la valeur retournée lorsque le résultat correct est inférieur à INT_MIN soit INT_MIN .
Le résultat correct peut être représenté comme int sur toutes les implémentations connues. Pour qu'un dépassement de capacité se produise, INT_MAX doit être inférieur à LDBL_MAX_EXP * log2 ( FLT_RADIX ) ou INT_MIN doit être supérieur à LDBL_MIN_EXP - LDBL_MANT_DIG ) * log2 ( FLT_RADIX ) .
La valeur de l'exposant retournée par
ilogb
est toujours inférieure de 1 à l'exposant retourné par
frexp
en raison des différentes exigences de normalisation : pour l'exposant
e
retourné par
ilogb
,
|arg*r
-e
|
est compris entre 1 et
r
(typiquement entre
1
et
2
), mais pour l'exposant
e
retourné par
frexp
,
|arg*2
-e
|
est compris entre
0.5
et
1
.
Exemple
#include <fenv.h> #include <float.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { double f = 123.45; printf("Étant donné le nombre %.2f ou %a en hexadécimal,\n", f, f); double f3; double f2 = modf(f, &f3); printf("modf() produit %.0f + %.2f\n", f3, f2); int i; f2 = frexp(f, &i); printf("frexp() produit %f * 2^%d\n", f2, i); i = ilogb(f); printf("logb()/ilogb() produisent %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // gestion des erreurs feclearexcept(FE_ALL_EXCEPT); printf("ilogb(0) = %d\n", ilogb(0)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID déclenchée"); }
Sortie possible :
Étant donné le nombre 123.45 ou 0x1.edccccccccccdp+6 en hexadécimal,
modf() produit 123 + 0.45
frexp() produit 0.964453 * 2^7
logb()/ilogb() produisent 1.92891 * 2^6
ilogb(0) = -2147483648
FE_INVALID déclenchée
Références
- Norme C23 (ISO/CEI 9899:2024) :
-
- 7.12/8 Mathématiques <math.h> (p: TBD)
-
- 7.12.6.5 Les fonctions ilogb (p: TBD)
-
- 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
-
- F.10.3.5 Les fonctions ilogb (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.12/8 Mathématiques <math.h> (p: TBD)
-
- 7.12.6.5 Les fonctions ilogb (p: TBD)
-
- 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
-
- F.10.3.5 Les fonctions ilogb (p: TBD)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 7.12/8 Mathématiques <math.h> (p: 232)
-
- 7.12.6.5 Les fonctions ilogb (p: 244)
-
- 7.25 Mathématiques génériques de type <tgmath.h> (p: 373-375)
-
- F.10.3.5 Les fonctions ilogb (p: 521)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.12/8 Mathématiques <math.h> (p. 213)
-
- 7.12.6.5 Les fonctions ilogb (p. 224-225)
-
- 7.22 Mathématiques génériques de type <tgmath.h> (p. 335-337)
-
- F.9.3.5 Les fonctions ilogb (p. 458)
Voir aussi
|
(C99)
(C99)
|
décompose un nombre en mantisse et puissance de
2
(fonction) |
|
(C99)
(C99)
(C99)
|
extrait l'exposant du nombre donné
(fonction) |
|
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
|
calcule efficacement un nombre multiplié par
FLT_RADIX
élevé à une puissance
(fonction) |
|
Documentation C++
pour
ilogb
|
|