Namensräume
Varianten
Aktionen

std::scalbn, std::scalbnf, std::scalbnl, std::scalbln, std::scalblnf, std::scalblnl

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

double      scalbn ( double num, int exp );

long double scalbn ( long double num, int exp );
(seit C++11)
(bis C++23)
constexpr /* gleitkommazahl-Typ */
            scalbn ( /* Gleitkomma-Typ */ num, int exp );
(seit C++23)
float       scalbnf( float num, int exp );
(2) (seit C++11)
(constexpr seit C++23)
long double scalbnl( long double num, int exp );
(3) (seit C++11)
(constexpr seit C++23)
long exponent
(4)
float       scalbln ( float num, long exp );

double      scalbln ( double num, long exp );

long double scalbln ( long double num, long exp );
(seit C++11)
(bis C++23)
constexpr /* gleitkommazahl-Typ */
            scalbln ( /* Gleitkomma-Typ */ num, long exp );
(seit C++23)
float       scalblnf( float num, long exp );
(5) (seit C++11)
(constexpr seit C++23)
long double scalblnl( long double num, long exp );
(6) (seit C++11)
(constexpr seit C++23)
Definiert in der Header-Datei <cmath>
template< class Integer >
double scalbn( Integer num, int exp );
(A) (seit C++11)
(constexpr seit C++23)
template< class Integer >
double scalbln( Integer num, long exp );
(B) (seit C++11)
(constexpr seit C++23)
1-6) Multipliziert einen Gleitkommawert num mit FLT_RADIX hoch exp. Die Bibliothek stellt Überladungen von std::scalbn und std::scalbln für alle cv-unqualifizierten Gleitkommatypen als Typ des Parameters num bereit.(seit C++23)
A,B) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.

Inhalt

[edit] Parameter

num - Gleitkomma- oder Ganzzahlwert
exp - ganzzahliger Wert

[edit] Rückgabewert

Wenn keine Fehler auftreten, wird num multipliziert mit FLT_RADIX zur Potenz von exp (num×FLT_RADIXexp
) 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, dann wird num unverändert zurückgegeben.
  • Wenn num NaN ist, wird NaN zurückgegeben.

[edit] Hinweise

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

Obwohl std::scalbn und std::scalbln so spezifiziert sind, dass sie die Operation effizient durchführen, sind sie auf vielen Implementierungen weniger effizient als Multiplikation oder Division mit einer Zweierpotenz mittels arithmetischer Operatoren.

Der Funktionsname steht für "new scalb", wobei scalb eine ältere, nicht-standardmäßige Funktion war, deren zweites Argument einen Gleitkommatyp hatte.

Die Funktion std::scalbln wird bereitgestellt, da der Faktor, der zur Skalierung vom kleinsten positiven Gleitkommawert zum größten endlichen benötigt wird, größer als 32767 sein kann, dem standardmäßig garantierten INT_MAX. Insbesondere für die 80-Bit long double beträgt der Faktor 32828.

Die GNU-Implementierung setzt unabhängig von math_errhandling errno nicht.

Die zusätzlichen Überladungen müssen nicht exakt wie in (A,B) angegeben bereitgestellt werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr Argument num vom ganzzahligen Typ

  • std::scalbn(num, exp) denselben Effekt hat wie std::scalbn(static_cast<double>(num), exp).
  • std::scalbln(num, exp) hat denselben Effekt wie std::scalbln(static_cast<double>(num), exp).

[edit] Beispiel

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

Mögliche Ausgabe

scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(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)
multipliziert eine Zahl mit 2 hoch einer ganzzahligen Potenz
(Funktion) [bearbeiten]
C-Dokumentation für scalbn