logb, logbf, logbl
From cppreference.com
| ヘッダー <math.h> で定義 |
||
| float logbf( float arg ); |
(1) | (C99以降) |
| double logb( double arg ); |
(2) | (C99以降) |
| long double logbl( long double arg ); |
(3) | (C99以降) |
| ヘッダー <tgmath.h> で定義 |
||
| #define logb( arg ) |
(4) | (C99以降) |
1-3) 浮動小数点引数 arg から、基数に依存しない(unbiased)指数部分を抽出し、浮動小数点値として返します。
4) 型汎用マクロ: arg が long double 型の場合、
logbl が呼び出されます。そうでなく、arg が整数型または double 型の場合、logb が呼び出されます。それ以外の場合は、logbf が呼び出されます。厳密には、基数に依存しない指数とは、非ゼロの arg に対して、logr|arg| (この関数によって浮動小数点値として返される)の符号付き整数部分です。ここで `r` は FLT_RADIX です。arg がサブナマル(subnormal)の場合、正規化されていたかのように扱われます。
目次 |
[編集] パラメータ
| arg | - | floating-point value |
[編集] 戻り値
エラーが発生しない場合、arg の基数に依存しない指数が符号付き浮動小数点値として返されます。
ドメインエラーが発生した場合、実装定義の値が返されます。
極値エラーが発生した場合、-HUGE_VAL、-HUGE_VALF、または-HUGE_VALLが返されます。
[編集] エラー処理
エラーは math_errhandling で指定されたとおりに報告されます。
arg がゼロの場合、定義域エラーまたは範囲エラーが発生する可能性があります。
実装がIEEE浮動小数点算術 (IEC 60559) をサポートしている場合、
- arg が ±0 の場合、-∞ が返され、FE_DIVBYZERO が発生します。
- arg が ±∞ の場合、+∞ が返されます。
- arg が NaN の場合、NaN が返されます。
- その他のすべてのケースでは、結果は正確であり(FE_INEXACT は発生しません)、現在の丸めモードは無視されます。
[編集] 注釈
POSIX では、arg が ±0 の場合にポールエラーが発生することが要求されています。
logb が返す指数値は、正規化の要件が異なるため、frexp が返す指数値よりも常に 1 小さくなります。これは、logb によって返される指数 `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 = logb(f); printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); // error handling feclearexcept(FE_ALL_EXCEPT); printf("logb(0) = %f\n", logb(0)); if (fetestexcept(FE_DIVBYZERO)) puts(" FE_DIVBYZERO raised"); }
実行結果の例
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/logb() make 1.928906 * 2^6
logb(0) = -Inf
FE_DIVBYZERO raised[編集] 参照
- C23標準 (ISO/IEC 9899:2024)
- 7.12.6.11 The logb functions (p: TBD)
- 7.25 Type-generic math <tgmath.h> (p: TBD)
- F.10.3.11 The logb functions (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.12.6.11 The logb functions (p: 179-180)
- 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
- F.10.3.11 The logb functions (p: 381)
- C11標準 (ISO/IEC 9899:2011)
- 7.12.6.11 The logb functions (p: 246)
- 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
- F.10.3.11 The logb functions (p: 522)
- C99標準 (ISO/IEC 9899:1999)
- 7.12.6.11 The logb functions (p: 227)
- 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
- F.9.3.11 The logb functions (p: 459)
[編集] 関連項目
| (C99)(C99) |
数を仮数部と2のべき乗に分割する (関数) |
| (C99)(C99)(C99) |
与えられた数の指数を抽出する (関数) |
| (C99)(C99)(C99)(C99)(C99)(C99) |
FLT_RADIXのべき乗に数を効率的に掛ける (関数) |
| C++ ドキュメント: logb
| |