scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl
From cppreference.com
| ヘッダー <math.h> で定義 |
||
| float scalbnf( float arg, int exp ); |
(1) | (C99以降) |
| double scalbn( double arg, int exp ); |
(2) | (C99以降) |
| long double scalbnl( long double arg, int exp ); |
(3) | (C99以降) |
| ヘッダー <tgmath.h> で定義 |
||
| #define scalbn( arg, exp ) |
(4) | (C99以降) |
| ヘッダー <math.h> で定義 |
||
| float scalblnf( float arg, long exp ); |
(5) | (C99以降) |
| double scalbln( double arg, long exp ); |
(6) | (C99以降) |
| long double scalblnl( long double arg, long exp ); |
(7) | (C99以降) |
| ヘッダー <tgmath.h> で定義 |
||
| #define scalbln( arg, exp ) |
(8) | (C99以降) |
4,8) 型汎用マクロ: arg の型が long double の場合、
scalbnl または scalblnl が呼び出されます。それ以外の場合、 arg の型が整数型または double の場合、scalbn または scalbln が呼び出されます。それ以外の場合、それぞれ scalbnf または scalblnf が呼び出されます。目次 |
[edit] パラメータ
| arg | - | floating-point value |
| exp | - | 整数値 |
[edit] 戻り値
エラーが発生しない場合、arg に FLT_RADIX の exp 乗を計算した結果が返されます(arg×FLT_RADIXexp
)。
オーバーフローによる範囲エラーが発生した場合、±HUGE_VAL、±HUGE_VALF、または ±HUGE_VALL が返されます。
アンダーフローによる範囲エラーが発生した場合、正しい結果(丸め後)が返されます。
[edit] エラー処理
エラーは math_errhandling で指定されたとおりに報告されます。
実装がIEEE浮動小数点算術 (IEC 60559) をサポートしている場合、
- 範囲エラーが発生しない限り、FE_INEXACT は決して設定されません(結果は正確です)。
- 範囲エラーが発生しない限り、現在の丸めモードは無視されます。
- arg が ±0 の場合、変更されずに返されます。
- arg が ±∞ の場合、変更されずに返されます。
- exp が 0 の場合、
argがそのまま返されます。 - arg が NaN の場合、NaN が返されます。
[edit] 注釈
バイナリシステム(FLT_RADIX が 2 の場合)では、scalbn は ldexp と同等です。
scalbn および scalbln は効率的な操作を行うように指定されていますが、多くの実装では、算術演算子を使用した 2 のべき乗による乗算や除算よりも効率が悪いです。
scalbln 関数は、最小の正の浮動小数点値から最大の有限値までのスケーリングに必要な係数が、標準で保証されている INT_MAX である 32767 を超える可能性があるため提供されています。特に、80 ビットの long double では、係数は 32828 です。
[edit] 例
このコードを実行
#include <errno.h> #include <fenv.h> #include <float.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { printf("scalbn(7, -4) = %f\n", scalbn(7, -4)); printf("scalbn(1, -1074) = %g (minimum positive subnormal double)\n", scalbn(1, -1074)); printf("scalbn(nextafter(1,0), 1024) = %g (largest finite double)\n", scalbn(nextafter(1,0), 1024)); // special values printf("scalbn(-0, 10) = %f\n", scalbn(-0.0, 10)); printf("scalbn(-Inf, -1) = %f\n", scalbn(-INFINITY, -1)); // error handling errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("scalbn(1, 1024) = %f\n", scalbn(1, 1024)); if (errno == ERANGE) perror(" errno == ERANGE"); if (fetestexcept(FE_OVERFLOW)) puts(" FE_OVERFLOW raised"); }
実行結果の例
scalbn(7, -4) = 0.437500
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0.000000
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
errno == ERANGE: Numerical result out of range
FE_OVERFLOW raised[edit] 参考文献
- C23標準 (ISO/IEC 9899:2024)
- 7.12.6.13 The scalbn functions (p: TBD)
- 7.25 Type-generic math <tgmath.h> (p: TBD)
- F.10.3.13 The scalbn functions (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 7.12.6.13 The scalbn functions (p: TBD)
- 7.25 Type-generic math <tgmath.h> (p: TBD)
- F.10.3.13 The scalbn functions (p: TBD)
- C11標準 (ISO/IEC 9899:2011)
- 7.12.6.13 The scalbn functions (p: 247)
- 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
- F.10.3.13 The scalbn functions (p: 523)
- C99標準 (ISO/IEC 9899:1999)
- 7.12.6.13 The scalbn functions (p: 228)
- 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
- F.9.3.13 The scalbn functions (p: 460)
[edit] 関連項目
| (C99)(C99) |
数を仮数部と2のべき乗に分割する (関数) |
| (C99)(C99) |
数に2のべき乗を掛ける (関数) |
| C++ ドキュメント for scalbn
| |