数値演算と浮動小数点のサポート

ユニバーサル 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 doubledouble を異なる型として扱いますが、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 の値を返します。 xy
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 ランタイム ルーチン
浮動小数点プリミティブ