最終更新日時(UTC):
が更新

履歴 編集

function
<cmath>

std::scalbn(C++11)

namespace std {
  float scalbn(float x, int n);             // (1) C++11からC++20まで
  double scalbn(double x, int n);           // (2) C++11からC++20まで
  long double scalbn(long double x, int n); // (3) C++11からC++20まで

  constexpr floating-point-type
    scalbn(floating-point-type x, int n);   // (4) C++23

  double
    scalbn(Integral x, int n);              // (5) C++11
  constexpr double
    scalbn(Integral x, int n);              // (5) C++23

  float
    scalbnf(float x, int n);                // (6) C++17
  constexpr float
    scalbnf(float x, int n);                // (6) C++23

  long double
    scalbnl(long double x, int n);          // (7) C++17
  constexpr long double
    scalbnl(long double x, int n);          // (7) C++23

  // 乗数として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 から
}

概要

x に、浮動小数点数の内部表現の基数 FLT_RADIXn 乗を掛けた値を効率的に(通常は FLT_RADIXn を明示的には計算せずに)計算する。scalbは「scale binary」を意味する。

この関数は、FLT_RADIX2 であるシステム上では、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::scalbn(3.0, 4);
  std::cout << result << std::endl;
}

出力例

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);
  }
}

バージョン

言語

  • C++11

処理系

参照