Namespaces
Variants

std:: ilogb, std:: ilogbf, std:: ilogbl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
ilogb
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
ヘッダーで定義 <cmath>
(1)
int ilogb ( float num ) ;

int ilogb ( double num ) ;

int ilogb ( long double num ) ;
(C++11以降)
(C++23以前)
constexpr int ilogb ( /* floating-point-type */ num ) ;
(C++23以降)
int ilogbf ( float num ) ;
(2) (C++11以降)
(C++23以降constexpr)
int ilogbl ( long double num ) ;
(3) (C++11以降)
(C++23以降constexpr)
#define FP_ILOGB0   /* implementation-defined */
(4) (C++11以降)
#define FP_ILOGBNAN /* implementation-defined */
(5) (C++11以降)
ヘッダーで定義 <cmath>
template < class Integer >
int ilogb ( Integer num ) ;
(A) (C++11以降)
(C++23以降constexpr)
1-3) 浮動小数点引数 num から不偏指数の値を抽出し、符号付き整数値として返します。 ライブラリは、パラメータ num の型として、すべてのcv修飾されていない浮動小数点型に対する std::ilogb のオーバーロードを提供します。 (C++23以降)
4) 整数定数式に展開され、その値は INT_MIN または - INT_MAX のいずれかになります。
5) 整数定数式に展開され、その値は INT_MIN または + INT_MAX のいずれかになります。
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。

形式的には、非バイアス指数は、非ゼロの num に対して、 log r |num| の整数部を符号付き整数値としたものである。ここで r std:: numeric_limits < T > :: radix であり、 T num の浮動小数点型である。

目次

パラメータ

num - 浮動小数点または整数値

戻り値

エラーが発生しない場合、 num の不偏指数が符号付きint値として返されます。

num がゼロの場合、 FP_ILOGB0 が返されます。

num が無限大の場合、 INT_MAX が返されます。

num が NaN の場合、 FP_ILOGBNAN が返されます。

正しい結果が INT_MAX より大きいか、 INT_MIN より小さい場合、戻り値は未規定です。

エラーハンドリング

エラーは、 math_errhandling で指定された通りに報告されます。

num がゼロ、無限大、またはNaNの場合、定義域エラーまたは値域エラーが発生する可能性があります。

正しい結果が INT_MAX より大きい場合、または INT_MIN より小さい場合、定義域エラーまたは範囲エラーが発生する可能性があります。

IEEE浮動小数点演算(IEC 60559)を実装がサポートしている場合、

注記

num がゼロ、無限大、NaNのいずれでもない場合、返される値は static_cast < int > ( std:: logb ( num ) ) と完全に等価です。

POSIXでは num がゼロ、無限大、NaN、または正しい結果が int の範囲外である場合、定義域エラーが発生することが要求されています。

POSIXはまた、XSI準拠システムにおいて、正しい結果が INT_MAX より大きい場合に返される値は INT_MAX であり、正しい結果が INT_MIN より小さい場合に返される値は INT_MIN であることも要求しています。

正しい結果は既知のすべての実装において int として表現できます。オーバーフローが発生するためには、 INT_MAX LDBL_MAX_EXP * std:: log2 ( FLT_RADIX ) より小さいか、 INT_MIN LDBL_MIN_EXP - LDBL_MANT_DIG ) * std:: log2 ( FLT_RADIX ) より大きくなければなりません。

std::ilogb が返す指数の値は、常に std::frexp が返す指数より1小さくなります。これは正規化の要件が異なるためです: std::ilogb が返す指数 e の場合、 |num*r -e
|
1 r の間(通常は 1 2 の間)ですが、 std::frexp が返す指数 e の場合、 |num*2 -e
|
0.5 1 の間になります。

追加のオーバーロードは (A) と完全に同一である必要はありません。整数型の引数 num に対して、 std :: ilogb ( num ) std :: ilogb ( static_cast < double > ( num ) ) と同じ効果を持つことを保証するのに十分なものであればよいのです。

様々な浮動小数点分解関数を比較します:

#include <cfenv>
#include <cmath>
#include <iostream>
#include <limits>
// #pragma STDC FENV_ACCESS ON
int main()
{
    double f = 123.45;
    std::cout << "Given the number " << f << " or " << std::hexfloat
              << f << std::defaultfloat << " in hex,\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() makes " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "ilogb(0) = " << std::ilogb(0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

出力例:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
ilogb(0) = -2147483648
    FE_INVALID raised

関連項目

(C++11) (C++11)
数値を仮数と基数2の指数に分解する
(関数)
(C++11) (C++11) (C++11)
数値の指数部を抽出する
(関数)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
数値に FLT_RADIX の累乗を乗算する
(関数)