std:: scalbn, std:: scalbnf, std:: scalbnl, std:: scalbln, std:: scalblnf, std:: scalblnl
|
Definiert im Header
<cmath>
|
||
|
int
exponent
|
||
| (1) | ||
|
float
scalbn
(
float
num,
int
exp
)
;
double
scalbn
(
double
num,
int
exp
)
;
|
(seit C++11)
(bis C++23) |
|
|
constexpr
/* Gleitkommatyp */
scalbn ( /* Gleitkommatyp */ 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
)
;
|
(seit C++11)
(bis C++23) |
|
|
constexpr
/* floating-point-type */
scalbln ( /* floating-point-type */ 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 im Header
<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) |
std::scalbn
und
std::scalbln
für alle cv-unqualifizierten Fließkommatypen als Typ des Parameters
num
bereit.
(seit C++23)
Inhaltsverzeichnis |
Parameter
| num | - | Fließkomma- oder Ganzzahlwert |
| exp | - | Ganzzahlwert |
Rückgabewert
Wenn keine Fehler auftreten,
num
multipliziert mit
FLT_RADIX
hoch
exp
(
num×FLT_RADIX
exp
) zurückgegeben.
Wenn ein Bereichsfehler aufgrund von Überlaufs auftritt,
±HUGE_VAL
,
±HUGE_VALF
, oder
±HUGE_VALL
wird zurückgegeben.
Wenn ein Bereichsfehler aufgrund von Unterlauf auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.
Fehlerbehandlung
Fehler werden gemeldet, wie in math_errhandling spezifiziert.
Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,
- Sofern kein Bereichsfehler auftritt, FE_INEXACT wird niemals ausgelöst (das Ergebnis ist exakt).
- Sofern kein Bereichsfehler auftritt, der aktuelle Rundungsmodus wird 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.
Hinweise
Auf binären Systemen (wo
FLT_RADIX
gleich
2
ist),
ist
std::scalbn
äquivalent zu
std::ldexp
.
Obwohl
std::scalbn
und
std::scalbln
spezifiziert sind, um die Operation effizient durchzuführen, sind sie in vielen Implementierungen weniger effizient als Multiplikation oder Division mit einer Zweierpotenz unter Verwendung arithmetischer Operatoren.
Der Funktionsname steht für "new scalb", wobei
scalb
eine ältere nicht-standardisierte Funktion war, deren zweites Argument einen Fließkommatyp hatte.
Die
std::scalbln
-Funktion wird bereitgestellt, weil der erforderliche Faktor zur Skalierung vom kleinsten positiven Gleitkommawert zum größten endlichen Wert größer als 32767 sein kann, der standardmäßig garantierte
INT_MAX
-Wert. Insbesondere für den 80-Bit-
long
double
beträgt der Faktor 32828.
Die GNU-Implementierung setzt
errno
unabhängig von
math_errhandling
nicht.
Die zusätzlichen Überladungen müssen nicht exakt als (A,B) bereitgestellt werden. Sie müssen lediglich ausreichen, um sicherzustellen, dass für ihr Argument num vom Ganzzahltyp:
- std :: scalbn ( num, exp ) hat denselben Effekt wie std :: scalbn ( static_cast < double > ( num ) , exp ) .
- std :: scalbln ( num, exp ) hat denselben Effekt wie std :: scalbln ( static_cast < double > ( num ) , exp ) .
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) << " (kleinste positive subnormale Double-Zahl)\n" << "scalbn(nextafter(1,0), 1024) = " << std::scalbn(std::nextafter(1,0), 1024) << " (größte endliche Double-Zahl)\n"; // spezielle Werte std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n' << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n'; // Fehlerbehandlung 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 ausgelöst\n"; }
Mögliche Ausgabe:
scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (kleinste positive subnormale Double-Zahl)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (größte endliche Double-Zahl)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
errno == ERANGE: Numerisches Ergebnis außerhalb des gültigen Bereichs
FE_OVERFLOW ausgelöst
Siehe auch
|
(C++11)
(C++11)
|
zerlegt eine Zahl in Signifikand und Basis-
2
-Exponent
(Funktion) |
|
(C++11)
(C++11)
|
multipliziert eine Zahl mit
2
potenziert mit einer ganzzahligen Potenz
(Funktion) |
|
C-Dokumentation
für
scalbn
|
|