名前空間
変種
操作

ilogb, ilogbf, ilogbl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
ilogb
(C99)
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
(C99)
FP_ILOGB0FP_ILOGBNAN
(C99)(C99)
 
ヘッダ <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) 型総称マクロ。 arglong double 型の場合は ilogbl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は ilogb が呼ばれます。 そうでなければ ilogbf が呼ばれます。
5) INT_MIN または -INT_MAX のいずれかの値を持つ整数定数式に展開されます。
6) INT_MIN または +INT_MAX のいずれかの値を持つ整数定数式に展開されます。

形式的には、バイアスされていない指数は、非ゼロの arg について、符号付き整数値としての log
r
|arg|
の整数部です。 ただし rFLT_RADIX です。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

エラーが発生しなければ、 arg のバイアスされていない指数が符号付き整数値として返されます。

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) をサポートしていれば、

  • 正しい結果が INT_MAX より大きいまたは INT_MIN より小さい場合、 FE_INVALID が発生します。
  • arg が ±0、 ±∞ または NaN の場合、 FE_INVALID が発生します。
  • それ以外の全ての場合において、結果は正確であり (FE_INEXACT が発生することはありません)、現在の丸めモードは無視されます。

[編集] ノート

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 <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12/8 Mathematics <math.h> (p: 232)
  • 7.12.6.5 The ilogb functions (p: 244)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.5 The ilogb functions (p: 521)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12/8 Mathematics <math.h> (p: 213)
  • 7.12.6.5 The ilogb functions (p: 224-225)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.5 The ilogb functions (p: 458)

[編集] 関連項目

数値を仮数と 2 の指数に分解します
(関数) [edit]
(C99)(C99)(C99)
指定された数値の指数を取り出します
(関数) [edit]
(C99)(C99)(C99)(C99)(C99)(C99)
数値と FLT_RADIX の累乗の乗算を効率良く計算します
(関数) [edit]