Namensräume
Varianten
Aktionen

std::frexp, std::frexpf, std::frexpl

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float        frexp ( float num, int* exp );

double      frexp ( double num, int* exp );

long double frexp ( long 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)
Definiert in der Header-Datei <cmath>
template< class Integer >
double      frexp ( Ganzzahl num, int* exp );
(A) (constexpr seit C++23)
1-3) Zerlegt den gegebenen Gleitkommawert num in einen normalisierten Bruch und einen ganzzahligen Exponenten zur Basis zwei. Die Bibliothek stellt Überladungen von 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) [bearbeiten]
(C++11)(C++11)(C++11)
extrahiert den Exponenten der Zahl
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
extrahiert den Exponenten der Zahl
(Funktion) [bearbeiten]
(C++11)(C++11)
zerlegt eine Zahl in Ganzzahl- und Bruchteilsteile
(Funktion) [bearbeiten]
C-Dokumentation für frexp