最終更新日時:
が更新

履歴 編集

function
<cmath>

std::logb(C++11)

namespace std {
  float logb(float x);
  double logb(double x);
  long double logb(long double x);

  double logb(Integral);

  float logbf(float x);             // C++17 から
  long double logbl(long double x); // C++17 から
}

概要

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

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

戻り値

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

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

備考

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

#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

処理系