ilogb, ilogbf, ilogbl
|
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) |
ilogbl
aufgerufen. Andernfalls, wenn
arg
einen Ganzzahltyp oder den Typ
double
hat, wird
ilogb
aufgerufen. Andernfalls wird
ilogbf
aufgerufen.
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,
- 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.
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
|
(C99)
(C99)
|
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) |
|
C++-Dokumentation
für
ilogb
|
|