數學與浮點支援
本文內容
通用 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 double
和 double
視為不同的類型,但 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
將地區設定特定的字串轉換為 float
或 long 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
計算指數 e x
exp2
、 、 exp2f
exp2l
計算指數 2x
expm1
、 、 expm1f
expm1l
計算 e x -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
傳回的值 x
y
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 執行階段常式
浮點數基本