Namespaces
Variants

ilogb, ilogbf, ilogbl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
(C99) (C99)
ilogb llogb
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
FP_ILOGB0 FP_ILOGBNAN
(C99) (C99)
FP_LLOGB0 FP_LLOGBNAN
(C23) (C23)
Error handling
Fast operation indicators
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)
1-3) Extrait la valeur de l'exposant non biaisé de l'argument à virgule flottante arg , et la retourne sous forme de valeur entière signée.
4) Macros génériques de type : Si arg a le type long double , ilogbl est appelé. Sinon, si arg a un type entier ou le type double , ilogb est appelé. Sinon, ilogbf est appelé.
5) Se développe en une expression constante entière dont la valeur est soit INT_MIN soit - INT_MAX .
6) Se développe en une expression constante entière dont la valeur est soit INT_MIN ou + INT_MAX .

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),

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

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)