std:: ilogb, std:: ilogbf, std:: ilogbl
|
Definiert in Header
<cmath>
|
||
| (1) | ||
|
int
ilogb
(
float
num
)
;
int
ilogb
(
double
num
)
;
|
(seit C++11)
(bis C++23) |
|
|
constexpr
int
ilogb
(
/* floating-point-type */
num
)
;
|
(seit C++23) | |
|
int
ilogbf
(
float
num
)
;
|
(2) |
(seit C++11)
(constexpr seit C++23) |
|
int
ilogbl
(
long
double
num
)
;
|
(3) |
(seit C++11)
(constexpr seit C++23) |
|
#define FP_ILOGB0 /* implementation-defined */
|
(4) | (seit C++11) |
|
#define FP_ILOGBNAN /* implementation-defined */
|
(5) | (seit C++11) |
|
Definiert in Header
<cmath>
|
||
|
template
<
class
Integer
>
int ilogb ( Integer num ) ; |
(A) |
(seit C++11)
(constexpr seit C++23) |
std::ilogb
für alle cv-unqualifizierten Gleitkommatypen als Typ des Parameters
num
bereit.
(since C++23)
Formal ist der unverzerrte Exponent der ganzzahlige Anteil von
log
r
|num|
als vorzeichenbehafteter Ganzzahlwert, für nicht-null
num
, wobei
r
gleich
std::
numeric_limits
<
T
>
::
radix
ist und
T
der Gleitkommatyp von
num
ist.
Inhaltsverzeichnis |
Parameter
| num | - | Gleitkomma- oder Ganzzahlwert |
Rückgabewert
Wenn keine Fehler auftreten, wird der unverzerrte Exponent von num als vorzeichenbehafteter int-Wert zurückgegeben.
Wenn num null ist, wird FP_ILOGB0 zurückgegeben.
Wenn num unendlich ist, wird INT_MAX zurückgegeben.
Wenn num 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.
Fehlerbehandlung
Fehler werden gemeldet, wie in math_errhandling spezifiziert.
Ein Domänenfehler oder Wertebereichsfehler kann auftreten, wenn num 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 num ±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 num nicht null, unendlich oder NaN ist, ist der zurückgegebene Wert exakt äquivalent zu static_cast < int > ( std:: logb ( num ) ) .
POSIX erfordert dass ein Domänenfehler auftritt, wenn num 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 * std:: log2 ( FLT_RADIX ) oder INT_MIN größer sein als LDBL_MIN_EXP - LDBL_MANT_DIG ) * std:: log2 ( FLT_RADIX ) .
Der vom Exponenten zurückgegebene Wert von
std::ilogb
ist immer 1 kleiner als der von
std::frexp
zurückgegebene Exponent aufgrund der unterschiedlichen Normalisierungsanforderungen: Für den Exponenten
e
, der von
std::ilogb
zurückgegeben wird, liegt
|num*r
-e
|
zwischen
1
und
r
(typischerweise zwischen
1
und
2
), aber für den Exponenten
e
, der von
std::frexp
zurückgegeben wird, liegt
|num*2
-e
|
zwischen
0.5
und
1
.
Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen lediglich sicherstellen, dass für ihr Argument num vom Ganzzahltyp std :: ilogb ( num ) dieselbe Wirkung hat wie std :: ilogb ( static_cast < double > ( num ) ) .
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 << "ilogb(0) = " << std::ilogb(0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " FE_INVALID 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
ilogb(0) = -2147483648
FE_INVALID raised
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 einer Zahl
(Funktion) |
|
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
|
multipliziert eine Zahl mit
FLT_RADIX
potenziert mit einem Exponenten
(Funktion) |
|
C-Dokumentation
für
ilogb
|
|