数学和浮点支持

通用 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 版本,但请注意,二进制表示形式可能不同于其他编译器。

受支持的数学和浮点例程

例程 使用
计算整数类型的绝对值
.- . 计算反余弦值
.- . 计算双曲反余弦值
.- . 计算反正弦值
.- . 计算双曲反正弦值
计算反正切值
.- . 计算双曲反正切值
%> 将特定于区域设置的字符串转换为 double
%> 将字符串转换为 double
将特定于区域设置的字符串转换为 floatlong double
.- . 计算立方根
.- . 计算上限
.- . 计算相反数
%> 获取并清除浮点状态注册
.- . 获取并设置浮点控制字
_controlfp_s _controlfp 的安全版本
返回一个值,该值具有一个自变量的数值和另一个自变量的符号
.- . 计算正弦值
.- . 计算双曲正弦值
.- . 计算两个整数值的商和余数
%> double 转换为字符串
_ecvt_s _ecvt 的安全版本
.- . 计算错误函数
.- . 计算互补错误函数
.- . 计算指数 ex
.- . 计算指数 2x
.- . 计算 ex-1
.- . 计算浮点类型的绝对值
%> 将浮点数转换为字符串
_fcvt_s _fcvt 的安全版本
.- . 确定两个值之间的正数差
feclearexcept 清除指定的浮点异常
fegetenv 存储当前的浮点环境
fegetexceptflag 获取指定的浮点异常状态
fegetround 获取浮点舍入模式
feholdexcept 设置不间断的浮点异常模式
feraiseexcept 引发指定的浮点异常
fesetenv 设置当前的浮点环境
fesetexceptflag 获取指定的浮点异常状态标志
fesetround 设置指定的浮点舍入标志
fetestexcept 确定要设置的浮点异常状态标志
feupdateenv 还原浮点环境,然后引发以前的异常
.- . 计算下限
.- . 计算浮点混合乘加运算
.- . 计算参数的最大值
.- . 计算参数的最小值
.- . 计算浮点余数
%> 返回浮点值的分类
fpclassify 返回浮点值的分类
_fpieee_flt 设置浮点异常的处理程序
_fpreset 重置浮点环境
.- . 获取浮点数的尾数和指数
%> 将浮点数转换为字符串
_gcvt_s _gcvt 的安全版本
%> 获取或设置用于 x64 上 FMA3 指令的标志
计算斜边
.- . 计算以整数 2 为底的指数
imaxabs 计算整数类型的绝对值
imaxdiv 计算两个整数值的商和余数
.- . 确定某值是否有限
比较两个浮点值的顺序
isinf 确定浮点值是否为无穷大
.- . 测试 NaN 的浮点值
isnormal 测试浮点值是否既有限又不低于正常值
.- . 计算贝塞尔函数
.- . 计算 x*2n
.- . 计算 gamma 函数的绝对值的自然对数
.- . 将浮点值舍入为最接近的 long long
.- . 将浮点值舍入为最接近的 long long
计算自然对数或以 10 为底的对数
.- . 计算 1+x 的自然对数
.- . 计算以 2 为底的对数
返回浮点值的指数
.- . 将浮点值舍入为最接近的 long
%> 向左或向右旋转整数值
.- . 将浮点值舍入为最接近的 long
_matherr 默认数学错误处理程序
__max 返回两个值中的较大者的宏
__min 返回两个值中的较小者的宏
.- . 将浮点值拆分为小数部分和整数部分
.- . 返回 quiet NaN 值
.- . 返回舍入后的值
返回下一个可表示的浮点值
.- . 返回下一个可表示的浮点值
.- . 返回 xy 的值
.- . 计算两个浮点值的商的余数
.- . 计算两个整数值的余数
.- . 舍入浮点值
旋转整数类型中的位
.- . 舍入浮点值
%> 按 2 的幂缩放参数
将浮点数乘以 FLT_RADIX 的整数幂
_set_controlfp 设置浮点控制字
_set_SSE2_enable 启用或禁用 SSE2 指令
signbit 测试浮点值的符号位
.- . 计算正弦值
.- . 计算双曲正弦值
.- . 计算平方根
.- . 获取浮点状态字
%> 将字符串转换为 float
%> 将字符串转换为 long double
.- . 计算正切值
.- . 计算双曲正切值
.- . 计算 gamma 函数
.- . 截断小数部分
%> 将宽字符串转换为 double
.- . 计算贝塞尔函数

另请参阅

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