std::scalbn, std::scalbnf, std::scalbnl, std::scalbln, std::scalblnf, std::scalblnl
| ヘッダー <cmath> で定義 |
||
| 指数 |
||
| (1) | ||
float scalbn ( float num, int exp ); double scalbn ( double num, int exp ); |
(C++11以降) (C++23まで) |
|
| constexpr /* floating-point-type */ scalbn ( /* 浮動小数点型 */ num, int exp ); |
(C++23から) | |
| float scalbnf( float num, int exp ); |
(2) | (C++11以降) (C++23 以降 constexpr) |
| long double scalbnl( long double num, int exp ); |
(3) | (C++11以降) (C++23 以降 constexpr) |
| long exponent |
||
| (4) | ||
float scalbln ( float num, long exp ); double scalbln ( double num, long exp ); |
(C++11以降) (C++23まで) |
|
| constexpr /* floating-point-type */ scalbln ( /* 浮動小数点型 */ num, long exp ); |
(C++23から) | |
| float scalblnf( float num, long exp ); |
(5) | (C++11以降) (C++23 以降 constexpr) |
| long double scalblnl( long double num, long exp ); |
(6) | (C++11以降) (C++23 以降 constexpr) |
| ヘッダー <cmath> で定義 |
||
| template< class Integer > double scalbn( Integer num, int exp ); |
(A) | (C++11以降) (C++23 以降 constexpr) |
| template< class Integer > double scalbln( Integer num, long exp ); |
(B) | (C++11以降) (C++23 以降 constexpr) |
std::scalbn および std::scalbln のオーバーロードを提供します。(C++23 以降)目次 |
[編集] パラメータ
| num | - | 浮動小数点数または整数値 |
| exp | - | 整数値 |
[編集] 戻り値
エラーが発生しない場合、 num に FLT_RADIX の exp 乗を掛けた値 (num×FLT_RADIXexp
) が返されます。
オーバーフローによる範囲エラーが発生した場合、±HUGE_VAL、±HUGE_VALF、または ±HUGE_VALL のいずれかを返します。
アンダーフローによる範囲エラーが発生した場合、正しい結果(丸め後)が返されます。
[編集] エラー処理
エラーは math_errhandling で指定された通りに報告される。
実装がIEEE浮動小数点算術 (IEC 60559) をサポートしている場合、
- 範囲エラーが発生しない限り、 FE_INEXACT は決して設定されません(結果は正確です)。
- 範囲エラーが発生しない限り、 現在の丸めモード は無視されます。
- num が ±0 の場合、変更されずに返されます。
- num が ±∞ の場合、変更されずに返されます。
- exp が 0 の場合、 num は変更されずに返されます。
- num が NaN の場合、NaN が返されます。
[編集] 注意
バイナリシステム(FLT_RADIX が 2 の場合)では、std::scalbn は std::ldexp と同等です。
std::scalbn および std::scalbln は効率的に操作を実行するように指定されていますが、多くの実装では、算術演算子を使用した 2 のべき乗による乗算または除算よりも効率が悪いです。
関数名は「new scalb」の略で、scalb は、2番目の引数が浮動小数点型であった古い非標準関数です。
std::scalbln 関数は、最小の正の浮動小数点値から最大の有限値までのスケールに必要な係数が、標準で保証されている INT_MAX である 32767 を超える可能性があるため提供されています。特に、80ビットの long double では、係数は 32828 です。
GNU 実装では、math_errhandling にかかわらず errno は設定されません。
追加のオーバーロードは、(A,B) とまったく同じように提供される必要はありません。整数型の引数 num に対して、
- std::scalbn(num, exp) が std::scalbn(static_cast<double>(num), exp) と同じ効果を持つことを保証するだけで十分です。
- std::scalbln(num, exp) が std::scalbln(static_cast<double>(num), exp) と同じ効果を持つことを保証するだけで十分です。
[編集] 例
#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"; }
実行結果の例
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[編集] 関連項目
| (C++11)(C++11) |
数値を仮数部と2を底とする指数部に分解する (関数) |
| (C++11)(C++11) |
数値に2の整数乗を掛ける (関数) |
| C のドキュメント (scalbn)
| |