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
Definiert im Header <math.h>
int ilogbf ( float arg ) ;
(1) (seit C99)
int ilogb ( double arg ) ;
(2) (seit C99)
int ilogbl ( long double arg ) ;
(3) (seit C99)
Definiert im Header <tgmath.h>
#define ilogb( arg )
(4) (seit C99)
Definiert im Header <math.h>
#define FP_ILOGB0    /* implementation-defined */
(5) (seit C99)
#define FP_ILOGBNAN  /* implementation-defined */
(6) (seit C99)
1-3) Extrahiert den Wert des unvoreingenommenen Exponenten aus dem Gleitkomma-Argument arg und gibt ihn als vorzeichenbehafteten Ganzzahlwert zurück.
4) Typgenerische Makros: Wenn arg den Typ long double hat, wird ilogbl aufgerufen. Andernfalls, wenn arg einen Ganzzahltyp oder den Typ double hat, wird ilogb aufgerufen. Andernfalls wird ilogbf aufgerufen.
5) Erweitert sich zu einem ganzzahligen konstanten Ausdruck, dessen Wert entweder INT_MIN oder - INT_MAX ist.
6) Erweitert sich zu einem ganzzahligen konstanten Ausdruck, dessen Wert entweder INT_MIN oder + INT_MAX ist.

Formal ist der unverzerrte Exponent der ganzzahlige Teil von log r |arg| als vorzeichenbehafteter Ganzzahlwert für nicht-null arg , wobei r FLT_RADIX ist.

Inhaltsverzeichnis

Parameter

arg - Gleitkommawert

Rückgabewert

Wenn keine Fehler auftreten, wird der unverzerrte Exponent von arg als vorzeichenbehafteter int-Wert zurückgegeben.

Wenn arg null ist, wird FP_ILOGB0 zurückgegeben.

Wenn arg unendlich ist, wird INT_MAX zurückgegeben.

Wenn arg ein NaN ist, wird FP_ILOGBNAN zurückgegeben.

Wenn das korrekte Ergebnis größer als INT_MAX oder kleiner als INT_MIN ist, ist der Rückgabewert nicht spezifiziert und ein Domänenfehler oder Bereichsfehler kann auftreten.

Fehlerbehandlung

Fehler werden gemeldet, wie in math_errhandling spezifiziert.

Ein Domänenfehler oder Wertebereichsfehler kann auftreten, wenn arg null, unendlich oder NaN ist.

Wenn das korrekte Ergebnis größer als INT_MAX oder kleiner als INT_MIN ist, kann ein Definitionsbereichsfehler oder ein Wertebereichsfehler auftreten

Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,

Hinweise

Wenn arg nicht null, unendlich oder NaN ist, ist der zurückgegebene Wert exakt äquivalent zu ( int ) logb ( arg ) .

POSIX erfordert dass ein Domänenfehler auftritt, wenn arg null, unendlich, NaN ist oder wenn das korrekte Ergebnis außerhalb des Wertebereichs von int liegt.

POSIX verlangt außerdem, dass auf XSI-konformen Systemen der zurückgegebene Wert, wenn das korrekte Ergebnis größer als INT_MAX ist, INT_MAX beträgt und der zurückgegebene Wert, wenn das korrekte Ergebnis kleiner als INT_MIN ist, INT_MIN beträgt.

Das korrekte Ergebnis kann auf allen bekannten Implementierungen als int dargestellt werden. Damit ein Überlauf auftritt, muss INT_MAX kleiner sein als LDBL_MAX_EXP * log2 ( FLT_RADIX ) oder INT_MIN größer sein als LDBL_MIN_EXP - LDBL_MANT_DIG ) * log2 ( FLT_RADIX ) .

Der vom Exponenten zurückgegebene Wert von ilogb ist immer 1 weniger als der von frexp zurückgegebene Exponent aufgrund der unterschiedlichen Normalisierungsanforderungen: Für den Exponenten e , der von ilogb zurückgegeben wird, liegt |arg*r -e
|
zwischen 1 und r (typischerweise zwischen 1 und 2 ), aber für den Exponenten e , der von frexp zurückgegeben wird, liegt |arg*2 -e
|
zwischen 0.5 und 1 .

Beispiel

#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("Gegeben sei die Zahl %.2f oder %a in Hexadezimal,\n", f, f);
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() erzeugt %.0f + %.2f\n", f3, f2);
    int i;
    f2 = frexp(f, &i);
    printf("frexp() erzeugt %f * 2^%d\n", f2, i);
    i = ilogb(f);
    printf("logb()/ilogb() erzeugen %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
    // Fehlerbehandlung
    feclearexcept(FE_ALL_EXCEPT);
    printf("ilogb(0) = %d\n", ilogb(0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID ausgelöst");
}

Mögliche Ausgabe:

Gegeben sei die Zahl 123.45 oder 0x1.edccccccccccdp+6 in Hexadezimal,
modf() erzeugt 123 + 0.45
frexp() erzeugt 0.964453 * 2^7
logb()/ilogb() erzeugen 1.92891 * 2^6
ilogb(0) = -2147483648
    FE_INVALID ausgelöst

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.12/8 Mathematik <math.h> (S: TBD)
  • 7.12.6.5 Die ilogb-Funktionen (S: TBD)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S: TBD)
  • F.10.3.5 Die ilogb-Funktionen (S: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.12/8 Mathematik <math.h> (S.: TBD)
  • 7.12.6.5 Die ilogb-Funktionen (S.: TBD)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S.: TBD)
  • F.10.3.5 Die ilogb-Funktionen (S.: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.12/8 Mathematik <math.h> (S: 232)
  • 7.12.6.5 Die ilogb-Funktionen (S: 244)
  • 7.25 Typgenerische Mathematik <tgmath.h> (S: 373-375)
  • F.10.3.5 Die ilogb-Funktionen (S: 521)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.12/8 Mathematik <math.h> (S. 213)
  • 7.12.6.5 Die ilogb-Funktionen (S. 224-225)
  • 7.22 Typgenerische Mathematik <tgmath.h> (S. 335-337)
  • F.9.3.5 Die ilogb-Funktionen (S. 458)

Siehe auch

zerlegt eine Zahl in Mantisse und eine Potenz von 2
(Funktion)
(C99) (C99) (C99)
extrahiert den Exponenten der gegebenen Zahl
(Funktion)
(C99) (C99) (C99) (C99) (C99) (C99)
berechnet effizient eine Zahl multipliziert mit FLT_RADIX potenziert mit einem Exponenten
(Funktion)