ilogb, ilogbf, ilogbl
| ヘッダー <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以降) |
ilogbl が呼び出されます。それ以外の場合で、arg の型が整数型または double の場合、ilogb が呼び出されます。それ以外の場合は、ilogbf が呼び出されます。厳密には、アンスケール化された指数は、ゼロでない arg に対して、logr|arg| の整数部分を符号付き整数値としたものです。ここで r は FLT_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) をサポートしている場合、
- 正しい結果が 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_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("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)
[編集] 関連項目
| (C99)(C99) |
数を仮数部と2のべき乗に分割する (関数) |
| (C99)(C99)(C99) |
与えられた数の指数を抽出する (関数) |
| (C99)(C99)(C99)(C99)(C99)(C99) |
FLT_RADIXのべき乗に数を効率的に掛ける (関数) |
| C++ ドキュメント for ilogb
| |