std:: scalbn, std:: scalbnf, std:: scalbnl, std:: scalbln, std:: scalblnf, std:: scalblnl
|
定義済みヘッダー
<cmath>
|
||
|
int
exponent
|
||
| (1) | ||
|
float
scalbn
(
float
num,
int
exp
)
;
double
scalbn
(
double
num,
int
exp
)
;
|
(C++11以降)
(C++23まで) |
|
|
constexpr
/* floating-point-type */
scalbn ( /* floating-point-type */ num, int exp ) ; |
(C++23以降) | |
|
float
scalbnf
(
float
num,
int
exp
)
;
|
(2) |
(C++11以降)
(constexprはC++23以降) |
|
long
double
scalbnl
(
long
double
num,
int
exp
)
;
|
(3) |
(C++11以降)
(constexprはC++23以降) |
|
long
指数部
|
||
| (4) | ||
|
float
scalbln
(
float
num,
long
exp
)
;
double
scalbln
(
double
num,
long
exp
)
;
|
(C++11以降)
(C++23まで) |
|
|
constexpr
/* floating-point-type */
scalbln ( /* floating-point-type */ num, long exp ) ; |
(C++23以降) | |
|
float
scalblnf
(
float
num,
long
exp
)
;
|
(5) |
(C++11以降)
(constexpr C++23以降) |
|
long
double
scalblnl
(
long
double
num,
long
exp
)
;
|
(6) |
(C++11以降)
(constexpr C++23以降) |
|
ヘッダー
<cmath>
で定義
|
||
|
template
<
class
Integer
>
double scalbn ( Integer num, int exp ) ; |
(A) |
(C++11以降)
(constexpr C++23以降) |
|
template
<
class
Integer
>
double scalbln ( Integer num, long exp ) ; |
(B) |
(C++11以降)
(constexpr C++23以降) |
std::scalbn
および
std::scalbln
のオーバーロードを、パラメータ
num
の型としてすべてのcv修飾されていない浮動小数点型に対して提供します。
(C++23以降)
目次 |
パラメータ
| num | - | 浮動小数点または整数値 |
| exp | - | 整数値 |
戻り値
エラーが発生しなかった場合、
num
に
FLT_RADIX
の
exp
乗を乗じた値
(
num×FLT_RADIX
exp
) が返されます。
オーバーフローによる範囲エラーが発生した場合、
±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
は第二引数が浮動小数点型であった古い非標準関数を指します。
std::scalbln
関数が提供されている理由は、最小の正の浮動小数点値から最大の有限値へスケーリングするために必要な係数が、標準で保証されている
INT_MAX
である32767よりも大きくなる可能性があるためです。特に、80ビットの
long
double
の場合、その係数は32828です。
GNUの実装では、
errno
は
math_errhandling
に関わらず設定されません。
追加のオーバーロードは (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) << " (最小の正の非正規化 double)\n" << "scalbn(nextafter(1,0), 1024) = " << std::scalbn(std::nextafter(1,0), 1024) << " (最大の有限 double)\n"; // 特殊な値 std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n' << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n'; // エラー処理 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 が発生\n"; }
出力例:
scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (最小の正の非正規化 double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (最大の有限 double)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
errno == ERANGE: 数値結果が範囲外です
FE_OVERFLOW が発生
関連項目
|
(C++11)
(C++11)
|
数値を仮数と基数
2
の指数に分解する
(関数) |
|
(C++11)
(C++11)
|
数値に
2
の整数乗を乗算する
(関数) |
|
Cドキュメント
for
scalbn
|
|