namespace std {
float scalbln(float x, long int n); // (1) C++11からC++20まで
double scalbln(double x, long int n); // (2) C++11からC++20まで
long double scalbln(long double x, long int n); // (3) C++11からC++20まで
constexpr floating-point-type
scalbln(floating-point-type x, long int n); // (4) C++23
double
scalbln(Integral x, long int n); // (5) C++11
constexpr double
scalbln(Integral x, long int n); // (5) C++23
float
scalblnf(float x, long int n); // (6) C++17
constexpr float
scalblnf(float x, long int n); // (6) C++23
long double
scalblnl(long double x, long int n); // (7) C++17
constexpr long double
scalblnl(long double x, long int n); // (7) C++23
}
概要
scalbn()
の、乗数としてint
の代わりにlong int
をとるバージョン。
x
に、浮動小数点数の内部表現の基数 FLT_RADIX
の n
乗を掛けた値を効率的に(通常は FLT_RADIX
n を明示的には計算せずに)計算する。scalbは「scale binary」を意味する。
この関数は、FLT_RADIX
が 2
であるシステム上では、ldexp()
関数と等価である。
- (1) :
float
に対するオーバーロード - (2) :
double
に対するオーバーロード - (3) :
long double
に対するオーバーロード - (4) : 浮動小数点数型に対するオーバーロード
- (5) : 整数型に対するオーバーロード (
double
にキャストして計算される) - (6) :
float
型規定 - (7) :
long double
型規定
戻り値
x * FLT_RADIXn
オーバーフローエラー、アンダーフローエラーが発生する可能性がある。
備考
- この関数は元々
scalb()
という名前で提案されていたが、非標準の同名関数が広く実装されていた。そのため、new
の意味を持つn
を関数名の末尾に付けてscalbn()
関数として標準ライブラリに定義された。 - オーバーフローエラー、アンダーフローエラーが発生した場合の挙動については、
<cmath>
を参照。 -
処理系が IEC 60559 に準拠している場合(
std::numeric_limits<T>::is_iec559() != false
)、以下の規定が追加される。(複号同順)x = ±0
の場合、戻り値は±0
となる。n = 0
の場合、戻り値はx
となる。x = ±∞
の場合、戻り値は±∞
となる。- もしオーバーフローエラーやアンダーフローエラーを起こさなければ、結果は正確で現在の丸め方式には依存しない。
-
scalbln()
関数は、パラメータn
の型がlong int
であることを除いて、scalbn()
関数と等価である。 - C++23では、(1)、(2)、(3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された
例
#include <iostream>
#include <cmath>
int main()
{
// 3.0 * (FLT_RADIX^4)
double result = std::scalbln(3.0, 4);
std::cout << result << std::endl;
}
出力例
48
備考
特定の環境では、早期に constexpr
対応されている場合がある:
- GCC 4.6.1 以上
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 4.3.6 ✅
- ICC: ??
- Visual C++: ??