- cmath[meta header]
- std[meta namespace]
- function[meta id-type]
- cpp11[meta cpp]
namespace std {
float scalbn(float x, int n);
double scalbn(double x, int n);
long double scalbn(long double x, int n);
double scalbn(Integral x, int n);
float scalbnf(float x, int n); // C++17 から
long double scalbnl(long double x, int n); // C++17 から
// 乗数としてlong int型を受け取るバージョン
float scalbln(float x, long int n);
double scalbln(double x, long int n);
long double scalbln(long double x, long int n);
double scalbln(Integral x, long int n);
float scalblnf(float x, long int n); // C++17 から
long double scalblnl(long double x, long int n); // C++17 から
}- Integral[italic]
x に、浮動小数点数の内部表現の基数 FLT_RADIX の n 乗を掛けた値を効率的に(通常は FLT_RADIXn を明示的には計算せずに)計算する。scalbは「scale binary」を意味する。
この関数は、FLT_RADIX が 2 であるシステム上では、ldexp() 関数と等価である。
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()関数と等価である。
#include <iostream>
#include <cmath>
int main()
{
// 3.0 * (FLT_RADIX^4)
double result = std::scalbn(3.0, 4);
std::cout << result << std::endl;
}- std::scalbn[color ff0000]
48
特定の環境で constexpr 指定されている場合がある。(独自拡張)
- GCC 4.6.1 以上
namespace std {
double scalbn(double x, int n)
{
return x * std::pow(static_cast<double>(FLT_RADIX), n);
}
float scalbn(float x, int n)
{
return x * std::pow(static_cast<float>(FLT_RADIX), n);
}
long double scalbn(long double x, int n)
{
return x * std::pow(static_cast<long double>(FLT_RADIX), n);
}
}- std::pow[link pow.md]
- C++11
- Clang, C++11 mode: 3.0
- GCC, C++11 mode: 4.3.6
- ICC: ??
- Visual C++: ??