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

履歴 編集

function
<cmath>

std::logb(C++11)

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

  constexpr floating-point-type
    logb(floating-point-type x);    // (4) C++23

  double
    logb(Integral);                 // (5) C++11
  constexpr double
    logb(Integral);                 // (5) C++23

  float
    logbf(float x);                 // (6) C++17
  constexpr float
    logbf(float x);                 // (6) C++23

  long double
    logbl(long double x);           // (7) C++17
  constexpr long double
    logbl(long double x);           // (7) C++23
}

概要

logb関数(log binary)は、浮動小数点数 x の指数部である符号付き整数を、浮動小数点形式で返す。

log が名前に入っているが、通常の対数関数と異なり、引数の符号は無視されることに注意。

  • (1) : floatに対するオーバーロード
  • (2) : doubleに対するオーバーロード
  • (3) : long doubleに対するオーバーロード
  • (4) : 浮動小数点数型に対するオーバーロード
  • (5) : 整数型に対するオーバーロード (doubleにキャストして計算される)
  • (6) : float型規定
  • (7) : long double型規定

戻り値

|x| * FLT_RADIX-logb(x) が範囲 [1, FLT_RADIX) に収まるように指数を求めて返す。(非正規化数の場合でも正しい値が返る)

xがゼロの場合には、処理系によっては定義域エラーか極エラーが発生する。(備考参照)

備考

  • 定義域エラー、極エラーが発生した場合の挙動については、<cmath> を参照。
  • 処理系が IEC 60559 に準拠している場合(std::numeric_limits<T>::is_iec559() != false)、以下の規定が追加される。
    • x = ±0 の場合、戻り値は -∞ となり、FE_DIVBYZERO(ゼロ除算浮動小数点例外)が発生する。
    • x = ±∞ の場合、戻り値は +∞ となる。
    • 戻り値は正確で、現在の丸め方式に依存しない。
  • C++23では、(1)、(2)、(3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された

#include <cmath>
#include <limits>
#include <iostream>

int main()
{
  std::cout << "logb(48.0)   = " << std::logb(48.0) << std::endl;
  std::cout << "logb(-48.0)  = " << std::logb(-48.0) << std::endl;
  std::cout << "logb(+∞)     = " << std::logb(std::numeric_limits<double>::infinity()) << std::endl;
  std::cout << "logb(-∞)     = " << std::logb(-std::numeric_limits<double>::infinity()) << std::endl;
  std::cout << "logb(0.0)    = " << std::logb(0.0) << std::endl;
  std::cout << "logb(1e-309) = " << std::logb(1e-309) << std::endl;
}

出力例

logb(48.0)   = 5
logb(-48.0)  = 5
logb(+∞)     = inf
logb(-∞)     = inf
logb(0.0)    = -inf
logb(1e-309) = -1027

バージョン

言語

  • C++11

処理系

参照