Namespaces
Variants

ilogb, ilogbf, ilogbl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
(C99) (C99)
ilogb llogb
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
FP_ILOGB0 FP_ILOGBNAN
(C99) (C99)
FP_LLOGB0 FP_LLOGBNAN
(C23) (C23)
Error handling
Fast operation indicators
定義済みヘッダー <math.h>
int ilogbf ( float arg ) ;
(1) (C99以降)
int ilogb ( double arg ) ;
(2) (C99以降)
int ilogbl ( long double arg ) ;
(3) (C99以降)
定義済みヘッダー <tgmath.h>
#define ilogb( arg )
(4) (C99以降)
定義済みヘッダー <math.h>
#define FP_ILOGB0    /* implementation-defined */
(5) (C99以降)
#define FP_ILOGBNAN  /* implementation-defined */
(6) (C99以降)
1-3) 浮動小数点引数 arg から不偏指数の値を抽出し、符号付き整数値として返します。
4) 型総称マクロ: arg の型が long double の場合、 ilogbl が呼び出される。それ以外の場合、 arg が整数型または double 型の場合、 ilogb が呼び出される。それ以外の場合、 ilogbf が呼び出される。
5) 整数定数式に展開され、その値は INT_MIN または - INT_MAX のいずれかになります。
6) 整数定数式に展開され、その値は INT_MIN または + INT_MAX のいずれかになります。

形式的には、非ゼロの arg に対する不偏指数は、 log r |arg| の整数部を符号付き整数値としたものであり、ここで r FLT_RADIX である。

目次

パラメータ

arg - 浮動小数点値

戻り値

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

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

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

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

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

エラー処理

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

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

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

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

注記

arg がゼロ、無限、NaNでない場合、返される値は ( int ) logb ( arg ) と完全に等価です。

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

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

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

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

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
int main(void)
{
    double f = 123.45;
    printf("与えられた数値 %.2f または16進数で %a\n", f, f);
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() は %.0f + %.2f を生成\n", f3, f2);
    int i;
    f2 = frexp(f, &i);
    printf("frexp() は %f * 2^%d を生成\n", f2, i);
    i = ilogb(f);
    printf("logb()/ilogb() は %f * %d^%d を生成\n", f/scalbn(1.0, i), FLT_RADIX, i);
    // エラー処理
    feclearexcept(FE_ALL_EXCEPT);
    printf("ilogb(0) = %d\n", ilogb(0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID が発生");
}

出力例:

与えられた数値 123.45 または16進数で 0x1.edccccccccccdp+6
modf() は 123 + 0.45 を生成
frexp() は 0.964453 * 2^7 を生成
logb()/ilogb() は 1.92891 * 2^6 を生成
ilogb(0) = -2147483648
    FE_INVALID が発生

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.12/8 数学 <math.h> (p: TBD)
  • 7.12.6.5 ilogb関数群 (p: TBD)
  • 7.25 総称数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb関数群 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.12/8 数学 <math.h> (p: TBD)
  • 7.12.6.5 ilogb関数 (p: TBD)
  • 7.25 総称数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb関数 (p: TBD)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.12/8 数学 <math.h> (p: 232)
  • 7.12.6.5 ilogb関数 (p: 244)
  • 7.25 総称数学 <tgmath.h> (p: 373-375)
  • F.10.3.5 ilogb関数 (p: 521)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.12/8 数学 <math.h> (p: 213)
  • 7.12.6.5 ilogb関数 (p: 224-225)
  • 7.22 総称数学 <tgmath.h> (p: 335-337)
  • F.9.3.5 ilogb関数 (p: 458)

関連項目

数値を仮数と2の累乗に分解する
(関数)
(C99) (C99) (C99)
指定された数値の指数を抽出する
(関数)
(C99) (C99) (C99) (C99) (C99) (C99)
数値に FLT_RADIX の累乗を効率的に乗算する
(関数)