Namensräume
Varianten
Aktionen

std::ldexp, std::ldexpf, std::ldexpl

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

double      ldexp ( double num, int exp );

long double ldexp ( long double num, int exp );
(bis C++23)
constexpr /* gleitkommazahl-Typ */
            ldexp ( /* Gleitkommazahltyp */ num, int exp );
(seit C++23)
float        ldexpf( float num, int exp );
(2) (seit C++11)
(constexpr seit C++23)
long double ldexpl( long double num, int exp );
(3) (seit C++11)
(constexpr seit C++23)
Definiert in der Header-Datei <cmath>
template< class Integer >
double      ldexp ( Ganzzahl num, int exp );
(A) (seit C++11)
(constexpr seit C++23)
1-3) Multipliziert einen Gleitkommawert num mit der Zahl 2, hoch die Potenz exp. Die Bibliothek stellt Überladungen von std::ldexp 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

[edit] Parameter

num - Gleitkomma- oder Ganzzahlwert
exp - ganzzahliger Wert

[edit] Rückgabewert

Wenn keine Fehler auftreten, wird num multipliziert mit 2 hoch exp (num×2exp
) zurückgegeben.

Wenn ein Bereichsfehler aufgrund von Überlauf auftritt, wird ±HUGE_VAL, ±HUGE_VALF oder ±HUGE_VALL zurückgegeben.

Wenn ein Bereichsfehler aufgrund von Unterlauf auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.

[edit] Fehlerbehandlung

Fehler werden wie in math_errhandling beschrieben gemeldet.

Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,

  • Sofern kein Bereichsfehler auftritt, wird FE_INEXACT niemals ausgelöst (das Ergebnis ist exakt).
  • Sofern kein Bereichsfehler auftritt, wird der aktuelle Rundungsmodus ignoriert.
  • Wenn num ±0 ist, wird es unverändert zurückgegeben.
  • Wenn num ±∞ ist, wird es unverändert zurückgegeben.
  • Wenn exp 0 ist, wird num unverändert zurückgegeben.
  • Wenn num NaN ist, wird NaN zurückgegeben.

[edit] Anmerkungen

Auf binären Systemen (wo FLT_RADIX 2 ist), ist std::ldexp äquivalent zu std::scalbn.

Die Funktion std::ldexp ("load exponent"), zusammen mit ihrem Gegenstück std::frexp, kann verwendet werden, um die Darstellung einer Gleitkommazahl ohne direkte Bitmanipulationen zu verändern.

Auf vielen Implementierungen ist std::ldexp weniger effizient als Multiplikation oder Division mit einer Zweierpotenz mittels arithmetischer Operatoren.

Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr Argument num vom ganzzahligen Typ, std::ldexp(num, exp) denselben Effekt hat wie std::ldexp(static_cast<double>(num), exp).

Für die Potenzierung von 2 mit einem Gleitkomma-Exponenten kann std::exp2 verwendet werden.

[edit] Beispiel

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
 
int main()
{
    std::cout
        << "ldexp(5, 3) = 5 * 8 = " << std::ldexp(5, 3) << '\n'
        << "ldexp(7, -4) = 7 / 16 = " << std::ldexp(7, -4) << '\n'
        << "ldexp(1, -1074) = " << std::ldexp(1, -1074)
        << " (minimum positive subnormal float64_t)\n"
        << "ldexp(nextafter(1,0), 1024) = "
        << std::ldexp(std::nextafter(1,0), 1024)
        << " (largest finite float64_t)\n";
 
    // special values
    std::cout << "ldexp(-0, 10) = " << std::ldexp(-0.0, 10) << '\n'
              << "ldexp(-Inf, -1) = " << std::ldexp(-INFINITY, -1) << '\n';
 
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    const double inf = std::ldexp(1, 1024);
    const bool is_range_error = errno == ERANGE;
 
    std::cout << "ldexp(1, 1024) = " << inf << '\n';
    if (is_range_error)
        std::cout << "    errno == ERANGE: " << std::strerror(ERANGE) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

Mögliche Ausgabe

ldexp(5, 3) = 5 * 8 = 40
ldexp(7, -4) = 7 / 16 = 0.4375
ldexp(1, -1074) = 4.94066e-324 (minimum positive subnormal float64_t)
ldexp(nextafter(1,0), 1024) = 1.79769e+308 (largest finite float64_t)
ldexp(-0, 10) = -0
ldexp(-Inf, -1) = -inf
ldexp(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

[edit] Siehe auch

(C++11)(C++11)
zerlegt eine Zahl in Signifikand und Basis-2-Exponent
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
multipliziert eine Zahl mit FLT_RADIX hoch einer Potenz
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
gibt 2 hoch der gegebenen Potenz zurück (2x)
(Funktion) [bearbeiten]
C-Dokumentation für ldexp