數學與浮點支援

通用 C 執行時間程式庫 (UCRT) 提供許多整數和浮點數學程式庫函式,包括 ISO C99 所需的所有函式。 實作這些浮點函式可以平衡效能與正確性。 因為產生正確的四捨五入結果可能極為昂貴,所以這些函式會設計成有效率產生最接近正確四捨五入結果的近似值。 在大部分情況下,產生的結果會位於正確四捨五入結果的 +/-1 ULP(最小精確度單位)內,但在某些情況下可能會有較大的不精確性。

針對 ISO C Standard 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++ 支援 long double 類型作為 80 位元精確度浮點資料類型。 在更新版本的 Visual C++ 中,long double 資料類型是與 double 類型相同的 64 位元精確度浮點資料類型。 編譯器會將 long doubledouble 視為不同的類型,但 long double 函式與其 double 對應項目相同。 CRT 提供 long double 版本的數學函式以相容於 ISO C99 原始程式碼,但請注意,二進位表示法可能與其他編譯器不同。

支援的數學與浮點常式

常式 使用
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 將地區設定特定的字串轉換為 floatlong double
cbrt, cbrtf, cbrtl 計算立方根
ceil, ceilf, ceill 計算 ceiling
_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 計算兩個整數值的商數和餘數
_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 判斷兩值之間的正差
feclearexcept 清除指定的浮點例外狀況
fegetenv 儲存目前的浮點環境
fegetexceptflag 取得指定的浮點例外狀況狀態
fegetround 取得浮點進位模式
feholdexcept 設定持續的浮點例外狀況模式
feraiseexcept 引發指定的浮點例外狀況
fesetenv 設定目前的浮點環境
fesetexceptflag 設定指定的浮點狀態旗標
fesetround 設定指定的浮點進位模式
fetestexcept 決定要設定的浮點例外狀況狀態旗標
feupdateenv 先還原浮點環境再引發前一個例外狀況
floor, floorf, floorl 計算 floor
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 計算兩個整數值的商數和餘數
isfinite, _finite, _finitef 判斷值是否有限
isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered 比較兩個浮點值的順序
isinf 判斷指定的浮點值是否無限
isnan, _isnan, _isnanf 測試 NaN 的浮點值
isnormal 測試浮點值是否為有限且為次正規數
_j0, _j1, _jn 計算 Bessel 函式
ldexp, ldexpf, ldexpl 計算 x*2n
lgamma, lgammaf, lgammal 計算 gamma 函式絕對值的自然對數
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 傳回兩個值中較大值的巨集
__min 傳回兩個值中較小值的巨集
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 計算兩個浮點值商數的餘數
remquo, remquof, remquol 計算兩個整數值的餘數
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 計算 gamma 函式
trunc, truncf, truncl 截斷小數部分
_wtof, _wtof_l 將寬字元串轉換成 double
_y0, _y1, _yn 計算 Bessel 函式

另請參閱

依類別排序的通用 C 執行階段常式
浮點數基本