名前空間
変種
操作

ilogb, ilogbf, ilogbl

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
ilogbllogb
(C99)(C23)
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
FP_ILOGB0FP_ILOGBNAN
(C99)(C99)
FP_LLOGB0FP_LLOGBNAN
(C23)(C23)
エラーハンドリング
高速演算インジケータ
 
ヘッダー <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    /* 実装定義 */
(5) (C99以降)
#define FP_ILOGBNAN  /* 実装定義 */
(6) (C99以降)
1-3) 浮動小数点数引数 arg から、アンスケール化された指数 (unbiased exponent) の値を抽出し、符号付き整数値として返します。
4) 型汎用マクロ:arg の型が long double の場合、ilogbl が呼び出されます。それ以外の場合で、arg の型が整数型または double の場合、ilogb が呼び出されます。それ以外の場合は、ilogbf が呼び出されます。
5) INT_MIN または -INT_MAX のいずれかの値を持つ整数定数式に展開されます。
6) INT_MIN または +INT_MAX のいずれかの値を持つ整数定数式に展開されます。

厳密には、アンスケール化された指数は、ゼロでない arg に対して、logr|arg| の整数部分を符号付き整数値としたものです。ここで rFLT_RADIX です。

目次

[編集] 引数

arg - floating-point value

[編集] 戻り値

エラーが発生しなかった場合、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_MAXLDBL_MAX_EXP * log2(FLT_RADIX) より小さいか、INT_MINLDBL_MIN_EXP - LDBL_MANT_DIG) * log2(FLT_RADIX) より大きい必要があります。

ilogb によって返される指数は、正規化要件が異なるため、frexp によって返される指数よりも常に 1 小さくなります。ilogb によって返される指数 e については、|arg*r-e
|
は 1 と r (通常は 12) の間になりますが、frexp によって返される指数 e については、|arg*2-e
|
0.51 の間になります。

[編集]

#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("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.0f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("ilogb(0) = %d\n", ilogb(0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

実行結果の例

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

[編集] 参考文献

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

[編集] 関連項目

数を仮数部と2のべき乗に分割する
(関数) [編集]
(C99)(C99)(C99)
与えられた数の指数を抽出する
(関数) [編集]
(C99)(C99)(C99)(C99)(C99)(C99)
FLT_RADIXのべき乗に数を効率的に掛ける
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)