logb, logbf, logbl
| Definiert in Header <math.h> |
||
| float logbf( float arg ); |
(1) | (seit C99) |
| double logb( double arg ); |
(2) | (seit C99) |
| long double logbl( long double arg ); |
(3) | (seit C99) |
| Definiert in Header <tgmath.h> |
||
| #define logb( arg ) |
(4) | (seit C99) |
logbl aufgerufen. Andernfalls, wenn arg einen ganzzahligen Typ oder den Typ double hat, wird logb aufgerufen. Andernfalls wird logbf aufgerufen.Formal ist der vorzeichenunabhängige Exponent der ganzzahlige Teil von logr|arg| (der von dieser Funktion als Fließkommawert zurückgegeben wird) für ein von Null verschiedenes arg, wobei r FLT_RADIX ist. Wenn arg subnormal ist, wird es so behandelt, als wäre es normalisiert.
Inhalt |
[bearbeiten] Parameter
| arg | - | Gleitkommawert |
[bearbeiten] Rückgabewert
Wenn keine Fehler auftreten, wird der vorzeichenunabhängige Exponent von arg als vorzeichenbehafteter Fließkommawert zurückgegeben.
Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben.
Wenn ein Polfehler auftritt, wird -HUGE_VAL, -HUGE_VALF oder -HUGE_VALL zurückgegeben.
[bearbeiten] Fehlerbehandlung
Fehler werden wie in math_errhandling angegeben gemeldet.
Domänen- oder Bereichsfehler können auftreten, wenn arg Null ist.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn arg ±0 ist, wird -∞ zurückgegeben und FE_DIVBYZERO ausgelöst.
- Wenn arg ±∞ ist, wird +∞ zurückgegeben.
- Wenn arg NaN ist, wird NaN zurückgegeben.
- In allen anderen Fällen ist das Ergebnis exakt (FE_INEXACT wird nie ausgelöst) und der aktuelle Rundungsmodus wird ignoriert.
[bearbeiten] Hinweise
POSIX verlangt, dass ein Polfehler auftritt, wenn arg ±0 ist.
Der von logb zurückgegebene Exponentenwert ist immer um 1 kleiner als der von frexp zurückgegebene Exponent, aufgrund der unterschiedlichen Normalisierungsanforderungen: für den von logb 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.
[bearbeiten] Beispiel
Vergleicht verschiedene Funktionen zur Zerlegung von Gleitkommazahlen.
#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 = logb(f); printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // error handling feclearexcept(FE_ALL_EXCEPT); printf("logb(0) = %f\n", logb(0)); if (fetestexcept(FE_DIVBYZERO)) puts(" FE_DIVBYZERO 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()/logb() make 1.928906 * 2^6
logb(0) = -Inf
FE_DIVBYZERO raised[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.12.6.11 The logb functions (S. TBD)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. TBD)
- F.10.3.11 The logb functions (S. TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.12.6.11 The logb functions (S. 179-180)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
- F.10.3.11 The logb functions (S. 381)
- C11-Standard (ISO/IEC 9899:2011)
- 7.12.6.11 The logb functions (S. 246)
- 7.25 Typ-generische Mathematik <tgmath.h> (S. 373-375)
- F.10.3.11 The logb functions (S. 522)
- C99-Standard (ISO/IEC 9899:1999)
- 7.12.6.11 The logb functions (S. 227)
- 7.22 Typ-generische Mathematik <tgmath.h> (S. 335-337)
- F.9.3.11 The logb functions (S. 459)
[bearbeiten] 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 logb
| |