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

履歴 編集

function
<cmath>

std::ilogb(C++11)

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

  constexpr int
    ilogb(floating-point-type x); // (3) C++23

  int
    ilogb(Integral);              // (4) C++11
  constexpr int
    ilogb(Integral);              // (4) C++23

  int
    ilogbf(float x);              // (5) C++17
  constexpr int
    ilogbf(float x);              // (5) C++23

  int
    ilogbl(long double x);        // (6) C++17
  constexpr int
    ilogbl(long double x);        // (6) C++23
}

概要

ilogb関数(integer log binary)は、浮動小数点数 x の指数部を int として返す。

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

戻り値

x がゼロの場合は FP_ILOGB0 を、無限大の場合は INT_MAX を、NaN の場合は FP_ILOGBNAN を返す。 それ以外の場合は、logb(x) の戻り値を int にキャストして返すことと等価。

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

備考

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

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

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

出力例

ilogb(48.0)   = 5
ilogb(-48.0)  = 5
ilogb(+∞)     = 2147483647
ilogb(-∞)     = 2147483647
ilogb(0.0)    = -2147483648
ilogb(1e-309) = -1027

バージョン

言語

  • C++11

処理系

参照