std::logb, std::logbf, std::logbl
| Definiert in der Header-Datei <cmath> |
||
| (1) | ||
float logb ( float num ); double logb ( double num ); |
(bis C++23) | |
| constexpr /*Gleitkommazahl-Typ*/ logb ( /*Gleitkommazahl-Typ*/ num ); |
(seit C++23) | |
float logbf( float num ); |
(2) | (seit C++11) (constexpr seit C++23) |
long double logbl( long double num ); |
(3) | (seit C++11) (constexpr seit C++23) |
| SIMD-Überladung (seit C++26) |
||
| Definiert im Header <simd> |
||
| template< /*math-floating-point*/ V > constexpr /*deduzierter-simd-t*/<V> |
(S) | (seit C++26) |
| Zusätzliche Überladungen (seit C++11) |
||
| Definiert in der Header-Datei <cmath> |
||
template< class Integer > double logb ( Integer num ); |
(A) | (constexpr seit C++23) |
std::logb für alle cv-unqualifizierten Gleitkommatypen als Parametertyp bereit.(seit C++23)|
S) Die SIMD-Überladung führt ein elementweises
std::logb für v_num durch.
|
(seit C++26) |
|
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
|
(seit C++11) |
Formal ist der vorzeichenlose Exponent der ganzzahlige Teil von logr|num| (der von dieser Funktion als Gleitkommazahl zurückgegeben wird) für num ungleich Null, wobei r std::numeric_limits<T>::radix ist und T der Gleitkommatyp von num ist. Wenn num subnormal ist, wird es so behandelt, als wäre es normalisiert.
Inhalt |
[bearbeiten] Parameter
| num | - | Gleitkomma- oder Ganzzahlwert |
[bearbeiten] Rückgabewert
Wenn keine Fehler auftreten, wird der vorzeichenlose Exponent von num als vorzeichenbehafteter Gleitkommawert zurückgegeben.
Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben.
Wenn ein Pol-Fehler auftritt, werden -HUGE_VAL, -HUGE_VALF oder -HUGE_VALL zurückgegeben.
[bearbeiten] Fehlerbehandlung
Fehler werden wie in math_errhandling beschrieben gemeldet.
Domänen- oder Bereichsfehler können auftreten, wenn num Null ist.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn num ±0 ist, wird -∞ zurückgegeben und FE_DIVBYZERO ausgelöst.
- Wenn num ±∞ ist, wird +∞ zurückgegeben.
- Wenn num 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] Anmerkungen
POSIX verlangt, dass ein Polfehler auftritt, wenn num ±0 ist.
Der von std::logb zurückgegebene Exponentenwert ist immer um 1 kleiner als der von std::frexp zurückgegebene Exponent, aufgrund unterschiedlicher Normalisierungsanforderungen: für den von std::logb zurückgegebenen Exponenten e liegt |num*r-e
| zwischen 1 und r (typischerweise zwischen 1 und 2), aber für den von std::frexp zurückgegebenen Exponenten e liegt |num*2-e
| zwischen 0.5 und 1.
Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen nur ausreichend sein, um sicherzustellen, dass für ihr Argument num vom Integer-Typ std::logb(num) denselben Effekt hat wie std::logb(static_cast<double>(num)).
[bearbeiten] Beispiel
Vergleicht verschiedene Gleitkomma-Zerlegungsfunktionen
#include <cfenv> #include <cmath> #include <iostream> #include <limits> // #pragma STDC FENV_ACCESS ON int main() { double f = 123.45; std::cout << "Given the number " << f << " or " << std::hexfloat << f << std::defaultfloat << " in hex,\n"; double f3; double f2 = std::modf(f, &f3); std::cout << "modf() makes " << f3 << " + " << f2 << '\n'; int i; f2 = std::frexp(f, &i); std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n'; i = std::ilogb(f); std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * " << std::numeric_limits<double>::radix << "^" << std::ilogb(f) << '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout << "logb(0) = " << std::logb(0) << '\n'; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << " FE_DIVBYZERO raised\n"; }
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
logb(0) = -Inf
FE_DIVBYZERO raised[bearbeiten] Siehe auch
| (C++11)(C++11) |
zerlegt eine Zahl in Signifikand und Basis-2-Exponent (Funktion) |
| (C++11)(C++11)(C++11) |
extrahiert den Exponenten der Zahl (Funktion) |
| (C++11)(C++11)(C++11)(C++11)(C++11)(C++11) |
multipliziert eine Zahl mit FLT_RADIX hoch einer Potenz (Funktion) |
| C-Dokumentation für logb
| |