数学和浮点支持

通用 C 运行时库 (UCRT) 提供了许多整型和浮点数学库函数,包括 ISO C99 需要的所有函数。 这些浮点函数的实现是为了平衡性能与正确性。 因为产生正确舍入的结果可能成本过高,这些函数旨在有效地生成接近正确舍入结果的近似结果。 在大多数情况下,虽然可能存在误差较大的情况,但生成的结果在正确舍入结果的 +/-1 ULP(最小精度单位)范围内。

对于 ISO C 标准 11 (C11) 及更高版本,标头 <tgmath.h> 除了包括 <math.h><complex.h> 之外,还提供了根据参数类型调用相应数学函数的宏。 有关详细信息,请参阅泛型类型数学

许多浮点数学库函数具有不同 CPU 体系结构的不同实现。 例如,相比 64 位 x64 CRT,32 位 x86 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 为 ISO C99 源代码兼容性提供了数学函数的 long double 版本,但请注意,二进制表示形式可能不同于其他编译器。

受支持的数学和浮点例程

例程 使用
abslabsllabs_abs64 计算整数类型的绝对值
acosacosfacosl 计算反余弦值
acoshacoshfacoshl 计算双曲反余弦值
asinasinfasinl 计算反正弦值
asinhasinhfasinhl 计算双曲反正弦值
atanatanfatanlatan2atan2fatan2l 计算反正切值
atanhatanhfatanhl 计算双曲反正切值
_atodbl_atodbl_l 将特定于区域设置的字符串转换为 double
atof_atof_l 将字符串转换为 double
_atoflt_atoflt_l_atoldbl_atoldbl_l 将特定于区域设置的字符串转换为 floatlong double
cbrtcbrtfcbrtl 计算立方根
ceilceilfceill 计算上限
_chgsign_chgsignf_chgsignl 计算相反数
_clear87_clearfp 获取并清除浮点状态注册
_control87_controlfp__control87_2 获取并设置浮点控制字
_controlfp_s _controlfp 的安全版本
copysigncopysignfcopysignl_copysign_copysignf_copysignl 返回一个值,该值具有一个自变量的数值和另一个自变量的符号
coscosfcosl 计算正弦值
coshcoshfcoshl 计算双曲正弦值
divldivlldiv 计算两个整数值的商和余数
_ecvtecvt double 转换为字符串
_ecvt_s _ecvt 的安全版本
erferfferfl 计算错误函数
erfcerfcferfcl 计算互补错误函数
expexpfexpl 计算指数 ex
exp2exp2fexp2l 计算指数 2x
expm1expm1fexpm1l 计算 ex-1
fabsfabsffabsl 计算浮点类型的绝对值
_fcvtfcvt 将浮点数转换为字符串
_fcvt_s _fcvt 的安全版本
fdimfdimffdiml 确定两个值之间的正数差
feclearexcept 清除指定的浮点异常
fegetenv 存储当前的浮点环境
fegetexceptflag 获取指定的浮点异常状态
fegetround 获取浮点舍入模式
feholdexcept 设置不间断的浮点异常模式
feraiseexcept 引发指定的浮点异常
fesetenv 设置当前的浮点环境
fesetexceptflag 获取指定的浮点异常状态标志
fesetround 设置指定的浮点舍入标志
fetestexcept 确定要设置的浮点异常状态标志
feupdateenv 还原浮点环境,然后引发以前的异常
floorfloorffloorl 计算下限
fmafmaffmal 计算浮点混合乘加运算
fmaxfmaxffmaxl 计算参数的最大值
fminfminffminl 计算参数的最小值
fmodfmodffmodl 计算浮点余数
_fpclass_fpclassf 返回浮点值的分类
fpclassify 返回浮点值的分类
_fpieee_flt 设置浮点异常的处理程序
_fpreset 重置浮点环境
frexpfrexpffrexpl 获取浮点数的尾数和指数
_gcvtgcvt 将浮点数转换为字符串
_gcvt_s _gcvt 的安全版本
_get_FMA3_enable_set_FMA3_enable 获取或设置用于 x64 上 FMA3 指令的标志
hypothypotfhypotl_hypot_hypotf_hypotl 计算斜边
ilogbilogbfilogbl 计算以整数 2 为底的指数
imaxabs 计算整数类型的绝对值
imaxdiv 计算两个整数值的商和余数
isfinite_finite_finitef 确定某值是否有限
isgreaterisgreaterequalislessislessequalislessgreaterisunordered 比较两个浮点值的顺序
isinf 确定浮点值是否为无穷大
isnan_isnan_isnanf 测试 NaN 的浮点值
isnormal 测试浮点值是否既有限又不低于正常值
_j0_j1_jn 计算贝塞尔函数
ldexpldexpfldexpl 计算 x*2n
lgammalgammaflgammal 计算 gamma 函数的绝对值的自然对数
llrintllrintfllrintl 将浮点值舍入为最接近的 long long
llroundllroundfllroundl 将浮点值舍入为最接近的 long long
loglogflogllog10log10flog10l 计算自然对数或以 10 为底的对数
log1plog1pflog1pl 计算 1+x 的自然对数
log2log2flog2l 计算以 2 为底的对数
logblogbflogbl_logb_logbf 返回浮点值的指数
lrintlrintflrintl 将浮点值舍入为最接近的 long
_lrotl_lrotr 向左或向右旋转整数值
lroundlroundflroundl 将浮点值舍入为最接近的 long
_matherr 默认数学错误处理程序
__max 返回两个值中的较大者的宏
__min 返回两个值中的较小者的宏
modfmodffmodfl 将浮点值拆分为小数部分和整数部分
nannanfnanl 返回 quiet NaN 值
nearbyintnearbyintfnearbyintl 返回舍入后的值
nextafternextafterfnextafterl_nextafter_nextafterf 返回下一个可表示的浮点值
nexttowardnexttowardfnexttowardl 返回下一个可表示的浮点值
powpowfpowl 返回 xy 的值
remainderremainderfremainderl 计算两个浮点值的商的余数
remquoremquofremquol 计算两个整数值的余数
rintrintfrintl 舍入浮点值
_rotl_rotl64_rotr_rotr64 旋转整数类型中的位
roundroundfroundl 舍入浮点值
_scalb_scalbf 按 2 的幂缩放参数
scalbnscalbnfscalbnlscalblnscalblnfscalblnl 将浮点数乘以 FLT_RADIX 的整数幂
_set_controlfp 设置浮点控制字
_set_SSE2_enable 启用或禁用 SSE2 指令
signbit 测试浮点值的符号位
sinsinfsinl 计算正弦值
sinhsinhfsinhl 计算双曲正弦值
sqrtsqrtfsqrtl 计算平方根
_status87_statusfp_statusfp2 获取浮点状态字
strtof_strtof_l 将字符串转换为 float
strtold_strtold_l 将字符串转换为 long double
tantanftanl 计算正切值
tanhtanhftanhl 计算双曲正切值
tgammatgammaftgammal 计算 gamma 函数
trunctruncftruncl 截断小数部分
_wtof_wtof_l 将宽字符串转换为 double
_y0_y1_yn 计算贝塞尔函数

另请参阅

按类别分的通用 C 运行时例程
浮点基元