数値演算と浮動小数点のサポート
- [アーティクル]
-
-
ユニバーサル C ランタイム ライブラリ (UCRT) には、ISO C99 で必要なすべての関数を含む、多くの整数および浮動小数点演算ライブラリ関数が用意されています。 浮動小数点関数は、正確性とパフォーマンスのバランスをとるために実装されます。 正確に丸めた結果を生成するには非常にコストがかかる場合があるため、正確に丸めた結果の近似値を効率的に生成できるように当該関数が設計されました。 ほとんどの場合、生成される結果は、正しく丸められた結果の +/-1 ULP (最小精度の単位) 内にありますが、不正確さが大きい場合があります。
ISO C 標準 11 (C11) 以降では、<tgmath.h>
ヘッダーと、<math.h>
、<complex.h>
には、パラメーターの型に基づいて対応する数値演算関数を呼び出すマクロが用意されています。 詳細については、「ジェネリック型数値演算」を参照してください。
浮動小数点数値演算ライブラリ関数の多くは、CPU アーキテクチャの種類に応じて実装の種類も異なります。 たとえば、32 ビット x86 CRT の実装は、64 ビット x64 CRT の実装とは異なります。 さらに、関数の中には特定の CPU アーキテクチャに対して複数の実装が用意されているものもあります。 CPU でサポートされている命令セットに応じて実行時に動的に実装を選択するのが最も効率的な方法です。 たとえば、32 ビット x86 CRT で、一部の関数には x87 実装と SSE2 実装の両方が用意されています。 SSE2 をサポートしている CPU で実行すると、速い方の SSE2 実装が使用されます。 SSE2 をサポートしていない CPU で実行すると、遅い方の x87 実装が使用されます。 数値演算ライブラリ関数の実装の種類が異なると、結果を生成するために使用する CPU 命令およびアルゴリズムも異なる場合があります。このため、CPU 間で、関数の生成する結果が異なる場合があります。 ほとんどの場合、結果は正しく丸められた結果の +/-1 ULP 内にありますが、実際の結果は CPU によって異なる場合があります。
以前の 16 ビット バージョンの Microsoft C/C++ および Microsoft Visual C++ では、80 ビット精度浮動小数点データ型として long double
型をサポートしていました。 最近のバージョンの Visual C++ では、long double
データ型は、double
型と同じ 64 ビット精度浮動小数点データ型となっています。 コンパイラは、long double
と double
を異なる型として扱いますが、long double
関数は、対応する double
関数と同じものとなります。 CRT では、ISO C99 ソース コードの互換性を維持するために long double
バージョンの数値演算関数を提供しています。ただし、そのバイナリ表現は他のコンパイラと異なる場合があるので注意してください。
サポートされている数値演算と浮動小数点のルーチン
ルーチンによって返される値 |
使用 |
abs 、 labs 、 llabs 、 _abs64 |
整数型の絶対値を計算します |
acos 、 acosf 、 acosl |
アーク コサインを計算します |
acosh 、 acoshf 、 acoshl |
双曲線アーク コサインを計算します |
asin 、 asinf 、 asinl |
アーク サインを計算します |
asinh 、 asinhf 、 asinhl |
双曲線アーク サインを計算します |
atan 、 atanf 、 atanl 、 atan2 、 atan2f 、 atan2l |
アーク タンジェントを計算します |
atanh 、 atanhf 、 atanhl |
双曲線アーク タンジェントを計算します |
_atodbl , _atodbl_l |
ロケール固有の文字列を double に変換します |
atof , _atof_l |
文字列を double に変換します |
_atoflt 、 _atoflt_l 、 _atoldbl 、 _atoldbl_l |
ロケール固有の文字列を float または long double に変換します |
cbrt 、 cbrtf 、 cbrtl |
立方根を計算します |
ceil 、 ceilf 、 ceill |
切り上げを計算します |
_chgsign 、 _chgsignf 、 _chgsignl |
加法逆元を計算します |
_clear87 , _clearfp |
浮動小数点ステータス レジスタを取得してクリアします |
_control87 、 _controlfp 、 __control87_2 |
浮動小数点制御ワードを取得および設定します |
_controlfp_s |
安全なバージョンの _controlfp です |
copysign 、 copysignf 、 copysignl 、 _copysign 、 _copysignf 、 _copysignl |
ある引数の絶対値と別の引数の符号を持つ値を返します |
cos 、 cosf 、 cosl |
サインを計算します |
cosh 、 coshf 、 coshl |
双曲線サインを計算します |
div 、 ldiv 、 lldiv |
2 つの整数値の商と剰余を計算します |
_ecvt , ecvt |
double を文字列に変換します |
_ecvt_s |
安全なバージョンの _ecvt です |
erf 、 erff 、 erfl |
エラー関数を計算します |
erfc 、 erfcf 、 erfcl |
相補誤差関数を計算します |
exp 、 expf 、 expl |
指数 ex を計算します |
exp2 、 exp2f 、 exp2l |
指数 2x を計算します |
expm1 、 expm1f 、 expm1l |
ex-1 を計算します |
fabs 、 fabsf 、 fabsl |
浮動小数点型の絶対値を計算します |
_fcvt , fcvt |
浮動小数点数を文字列に変換します。 |
_fcvt_s |
安全なバージョンの _fcvt です |
fdim 、 fdimf 、 fdiml |
2 つの値の間の正の値の差を求めます |
feclearexcept |
指定した浮動小数点例外をクリアします |
fegetenv |
現在の浮動小数点環境を格納します |
fegetexceptflag |
指定した浮動小数点例外の状態を取得します |
fegetround |
浮動小数点丸めモード制御を取得します |
feholdexcept |
無停止浮動小数点例外モードを設定します |
feraiseexcept |
指定した浮動小数点例外を発生させます |
fesetenv |
現在の浮動小数点環境を設定します |
fesetexceptflag |
指定した浮動小数点状態フラグを設定します |
fesetround |
指定した浮動小数点丸めモードを設定します |
fetestexcept |
設定されている浮動小数点例外状態フラグを確認します |
feupdateenv |
浮動小数点環境を復元してから、前の例外を発生させます |
floor 、 floorf 、 floorl |
切り捨てを計算します |
fma 、 fmaf 、 fmal |
融合型積和演算を計算します |
fmax 、 fmaxf 、 fmaxl |
引数の最大値を計算します |
fmin 、 fminf 、 fminl |
引数の最小値を計算します |
fmod 、 fmodf 、 fmodl |
浮動小数点の剰余を計算します |
_fpclass , _fpclassf |
浮動小数点値の分類を返します |
fpclassify |
浮動小数点値の分類を返します |
_fpieee_flt |
浮動小数点例外のハンドラーを設定します |
_fpreset |
浮動小数点環境をリセットします |
frexp 、 frexpf 、 frexpl |
浮動小数点数の仮数と指数を取得します |
_gcvt , gcvt |
浮動小数点数を文字列に変換します。 |
_gcvt_s |
安全なバージョンの _gcvt です |
_get_FMA3_enable , _set_FMA3_enable |
x64 での FMA3 命令使用フラグを取得または設定します |
hypot 、 hypotf 、 hypotl 、 _hypot 、 _hypotf 、 _hypotl |
斜辺を計算します |
ilogb 、 ilogbf 、 ilogbl |
整数の 2 進数の指数を計算します |
imaxabs |
整数型の絶対値を計算します |
imaxdiv |
2 つの整数値の商と剰余を計算します |
isfinite 、 _finite 、 _finitef |
ある値が有限かどうかを確認します |
isgreater 、 isgreaterequal 、 isless 、 islessequal 、 islessgreater 、 isunordered |
2 つの浮動小数点値の順序を比較します |
isinf |
浮動小数点値が無限かどうかを決定します |
isnan 、 _isnan 、 _isnanf |
NaN の浮動小数点値をテストします |
isnormal |
浮動小数点値が有限であり、非正規ではないかどうかをテストします |
_j0 、 _j1 、 _jn |
Bessel 関数を計算します |
ldexp 、 ldexpf 、 ldexpl |
x*2n を計算します |
lgamma 、 lgammaf 、 lgammal |
ガンマ関数の絶対値の自然対数を計算します |
llrint 、 llrintf 、 llrintl |
浮動小数点値を最も近い long long 値に丸めます |
llround 、 llroundf 、 llroundl |
浮動小数点値を最も近い long long 値に丸めます |
log 、 logf 、 logl 、 log10 、 log10f 、 log10l |
自然対数または 10 を底とする対数を計算します |
log1p 、 log1pf 、 log1pl |
1+x の自然対数を計算します |
log2 、 log2f 、 log2l |
2 を底とする対数を計算します |
logb 、 logbf 、 logbl 、 _logb 、 _logbf |
浮動小数点値の指数を返します |
lrint 、 lrintf 、 lrintl |
浮動小数点値を最も近い long 値に丸めます |
_lrotl , _lrotr |
整数値を左または右に回転します |
lround 、 lroundf 、 lroundl |
浮動小数点値を最も近い long 値に丸めます |
_matherr |
既定の数値演算エラー ハンドラーです |
__max |
2 つの値の大きい方を返すマクロです |
__min |
2 つの値の小さい方を返すマクロです |
modf 、 modff 、 modfl |
浮動小数点値を小数部と整数部に分割します |
nan 、 nanf 、 nanl |
簡易な NaN 値を返します |
nearbyint 、 nearbyintf 、 nearbyintl |
丸められた値を返します |
nextafter 、 nextafterf 、 nextafterl 、 _nextafter 、 _nextafterf |
次の表現可能な浮動小数点値を返します |
nexttoward 、 nexttowardf 、 nexttowardl |
次の表現可能な浮動小数点値を返します |
pow 、 powf 、 powl |
の値を返します。 x y |
remainder 、 remainderf 、 remainderl |
2 つの浮動小数点値の商の剰余を計算します |
remquo 、 remquof 、 remquol |
2 つの整数値の剰余を計算します |
rint 、 rintf 、 rintl |
浮動小数点値を丸めます |
_rotl 、 _rotl64 、 _rotr 、 _rotr64 |
整数型のビットを回転します |
round 、 roundf 、 roundl |
浮動小数点値を丸めます |
_scalb , _scalbf |
引数を 2 のべき乗の倍率で増減させます |
scalbn 、 scalbnf 、 scalbnl 、 scalbln 、 scalblnf 、 scalblnl |
浮動小数点数に整数の累乗を乗算します。 FLT_RADIX |
_set_controlfp |
浮動小数点制御ワードを設定します |
_set_SSE2_enable |
SSE2 命令を有効または無効にします |
signbit |
浮動小数点値の符号ビットをテストします |
sin 、 sinf 、 sinl |
サインを計算します |
sinh 、 sinhf 、 sinhl |
双曲線サインを計算します |
sqrt 、 sqrtf 、 sqrtl |
平方根を計算します |
_status87 、 _statusfp 、 _statusfp2 |
浮動小数点ステータス ワードを取得します |
strtof , _strtof_l |
文字列を float に変換します |
strtold , _strtold_l |
文字列を long double に変換します |
tan 、 tanf 、 tanl |
タンジェントを計算します |
tanh 、 tanhf 、 tanhl |
双曲線タンジェントを計算します |
tgamma 、 tgammaf 、 tgammal |
ガンマ関数を計算します |
trunc 、 truncf 、 truncl |
小数部を切り捨てます |
_wtof , _wtof_l |
ワイド文字列を double に変換します |
_y0 、 _y1 、 _yn |
Bessel 関数を計算します |
関連項目
カテゴリ別ユニバーサル C ランタイム ルーチン
浮動小数点プリミティブ