ilogb, ilogbf, ilogbl
| Definiert in 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 in Header <tgmath.h> |
||
| #define ilogb( arg ) |
(4) | (seit C99) |
| Definiert in Header <math.h> |
||
| #define FP_ILOGB0 /* implementierungsabhängig */ |
(5) | (seit C99) |
| #define FP_ILOGBNAN /* implementierungsabhängig */ |
(6) | (seit C99) |
ilogbl aufgerufen. Andernfalls, wenn arg vom Ganzzahltyp oder vom Typ double ist, wird ilogb aufgerufen. Andernfalls wird ilogbf aufgerufen.Formal ist der unverzerrte Exponent der ganzzahlige Teil von logr|arg| als vorzeichenbehafteter ganzzahliger Wert, für ein Nicht-Null-Argument arg, wobei r FLT_RADIX ist.
Inhalt |
[edit] Parameter
| arg | - | Gleitkommawert |
[edit] 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 es kann ein Domänenfehler oder ein Bereichsfehler auftreten.
[edit] Fehlerbehandlung
Fehler werden wie in math_errhandling angegeben gemeldet.
Ein Domänenfehler oder ein Bereichsfehler 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 Domänenfehler oder ein Bereichsfehler auftreten.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn das korrekte Ergebnis größer als INT_MAX oder kleiner als INT_MIN ist, wird FE_INVALID ausgelöst.
- Wenn arg ±0, ±∞ oder NaN ist, wird FE_INVALID ausgelöst.
- In allen anderen Fällen ist das Ergebnis exakt ( FE_INEXACT wird niemals ausgelöst) und der aktuelle Rundungsmodus wird ignoriert.
[edit] Anmerkungen
Wenn arg nicht Null, unendlich oder NaN ist, ist der zurückgegebene Wert exakt äquivalent zu (int)logb(arg).
POSIX verlangt, dass ein Domänenfehler auftritt, wenn arg Null, unendlich, NaN ist oder wenn das korrekte Ergebnis außerhalb des Bereichs 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 ist und der zurückgegebene Wert, wenn das korrekte Ergebnis kleiner als INT_MIN ist, INT_MIN ist.
Das korrekte Ergebnis kann auf allen bekannten Implementierungen als int dargestellt werden. Damit ein Überlauf auftritt, muss INT_MAX kleiner als LDBL_MAX_EXP * log2(FLT_RADIX) sein oder INT_MIN muss größer als LDBL_MIN_EXP - LDBL_MANT_DIG) * log2(FLT_RADIX) sein.
Der von ilogb zurückgegebene Exponentenwert ist immer um 1 kleiner als der von frexp zurückgegebene Exponent, aufgrund der unterschiedlichen Normalisierungsanforderungen: Für den von ilogb zurückgegebenen Exponenten e liegt |arg*r-e
| zwischen 1 und r (typischerweise zwischen 1 und 2), aber für den von frexp zurückgegebenen Exponenten e liegt |arg*2-e
| zwischen 0.5 und 1.
[edit] 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("Given the number %.2f or %a in hex,\n", f, f); double f3; double f2 = modf(f, &f3); printf("modf() makes %.0f + %.2f\n", f3, f2); int i; f2 = frexp(f, &i); printf("frexp() makes %f * 2^%d\n", f2, i); i = ilogb(f); printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // error handling feclearexcept(FE_ALL_EXCEPT); printf("ilogb(0) = %d\n", ilogb(0)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID raised"); }
Mögliche Ausgabe
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
ilogb(0) = -2147483648
FE_INVALID raised[edit] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.12/8 Mathematics <math.h> (S. TBD)
- 7.12.6.5 Die ilogb-Funktionen (S. TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.5 Die ilogb-Funktionen (S. TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.12/8 Mathematics <math.h> (S. TBD)
- 7.12.6.5 Die ilogb-Funktionen (S. TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.5 Die ilogb-Funktionen (S. TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 7.12/8 Mathematics <math.h> (S. 232)
- 7.12.6.5 Die ilogb-Funktionen (S. 244)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
- F.10.3.5 Die ilogb-Funktionen (S. 521)
- C99-Standard (ISO/IEC 9899:1999)
- 7.12/8 Mathematics <math.h> (S. 213)
- 7.12.6.5 Die ilogb-Funktionen (S. 224-225)
- 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
- F.9.3.5 Die ilogb-Funktionen (S. 458)
[edit] Siehe auch
| (C99)(C99) |
teilt eine Zahl in Mantisse und Potenz von 2 auf (Funktion) |
| (C99)(C99)(C99) |
extrahiert den Exponenten der gegebenen Zahl (Funktion) |
| (C99)(C99)(C99)(C99)(C99)(C99) |
berechnet effizient eine Zahl mal FLT_RADIX hoch eine Potenz (Funktion) |
| C++ Dokumentation für ilogb
| |