std::frexp, std::frexpf, std::frexpl
| Definiert in der Header-Datei <cmath> |
||
| (1) | ||
float frexp ( float num, int* exp ); double frexp ( double num, int* exp ); |
(bis C++23) | |
| constexpr /* gleitkommazahl-Typ */ frexp ( /* Gleitkommatyp */ num, int* exp ); |
(seit C++23) | |
| float frexpf( float num, int* exp ); |
(2) | (seit C++11) (constexpr seit C++23) |
| long double frexpl( long double num, int* exp ); |
(3) | (seit C++11) (constexpr seit C++23) |
| Zusätzliche Überladungen (seit C++11) |
||
| Definiert in der Header-Datei <cmath> |
||
| template< class Integer > double frexp ( Ganzzahl num, int* exp ); |
(A) | (constexpr seit C++23) |
std::frexp für alle cv-unqualifizierten Gleitkommatypen als Typ des Parameters num bereit.(seit C++23)|
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
|
(seit C++11) |
Inhalt |
[bearbeiten] Parameter
| num | - | Gleitkomma- oder Ganzzahlwert |
| exp | - | Zeiger auf den ganzzahligen Wert, in dem der Exponent gespeichert werden soll |
[bearbeiten] Rückgabewert
Wenn num null ist, gibt Null zurück und speichert Null in *exp.
Andernfalls (wenn num nicht null ist), gibt die Funktion, falls keine Fehler auftreten, den Wert x im Bereich (-1, -0,5], [0,5, 1) zurück und speichert eine ganze Zahl in *exp, so dass x×2(*exp)
== num gilt.
Wenn der in *exp zu speichernde Wert außerhalb des Bereichs von int liegt, ist das Verhalten undefiniert.
[bearbeiten] Fehlerbehandlung
Diese Funktion unterliegt keinen Fehlern, die in math_errhandling spezifiziert sind.
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,
- Wenn num ±0 ist, wird es unverändert zurückgegeben und 0 wird in *exp gespeichert.
- Wenn num ±∞ ist, wird es zurückgegeben und ein undefinierter Wert wird in *exp gespeichert.
- Wenn num NaN ist, wird NaN zurückgegeben und ein undefinierter Wert wird in *exp gespeichert.
- Es werden keine Gleitkommaausnahmen ausgelöst.
- Wenn FLT_RADIX 2 (oder eine Potenz von 2) ist, ist der zurückgegebene Wert exakt, der aktuelle Rundungsmodus wird ignoriert.
[bearbeiten] Anmerkungen
Auf einem binären System (bei dem FLT_RADIX 2 ist), kann std::frexp implementiert werden als
{ *exp = (value == 0) ? 0 : (int)(1 + std::logb(value)); return std::scalbn(value, -(*exp)); }
Die Funktion std::frexp kann zusammen mit ihrer Umkehrfunktion std::ldexp verwendet werden, um die Darstellung einer Gleitkommazahl zu manipulieren, ohne direkte Bitmanipulationen durchzuführen.
Die zusätzlichen Überladungen müssen nicht genau wie (A) bereitgestellt werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr Argument num vom Ganzzahltyp, std::frexp(num, exp) denselben Effekt hat wie std::frexp(static_cast<double>(num), exp).
[bearbeiten] Beispiel
Vergleicht verschiedene Gleitkomma-Zerlegungsfunktionen
#include <cmath> #include <iostream> #include <limits> 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'; }
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
[bearbeiten] Siehe auch
| (C++11)(C++11) |
multipliziert eine Zahl mit 2 hoch einer ganzzahligen Potenz (Funktion) |
| (C++11)(C++11)(C++11) |
extrahiert den Exponenten der Zahl (Funktion) |
| (C++11)(C++11)(C++11) |
extrahiert den Exponenten der Zahl (Funktion) |
| (C++11)(C++11) |
zerlegt eine Zahl in Ganzzahl- und Bruchteilsteile (Funktion) |
| C-Dokumentation für frexp
| |