数学和浮点支持
通用 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 double
和 double
归为不同类型,但 long double
函数等于其 double
对应项。 CRT 为 ISO C99 源代码兼容性提供了数学函数的 long double
版本,但请注意,二进制表示形式可能不同于其他编译器。
受支持的数学和浮点例程
例程 | 使用 |
---|---|
计算整数类型的绝对值 | |
.- . | 计算反余弦值 |
.- . | 计算双曲反余弦值 |
.- . | 计算反正弦值 |
.- . | 计算双曲反正弦值 |
计算反正切值 | |
.- . | 计算双曲反正切值 |
%> | 将特定于区域设置的字符串转换为 double |
%> | 将字符串转换为 double |
将特定于区域设置的字符串转换为 float 或 long 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 值 |
.- . | 返回舍入后的值 |
返回下一个可表示的浮点值 | |
.- . | 返回下一个可表示的浮点值 |
.- . | 返回 x y 的值 |
.- . | 计算两个浮点值的商的余数 |
.- . | 计算两个整数值的余数 |
.- . | 舍入浮点值 |
旋转整数类型中的位 | |
.- . | 舍入浮点值 |
%> | 按 2 的幂缩放参数 |
将浮点数乘以 FLT_RADIX 的整数幂 |
|
_set_controlfp |
设置浮点控制字 |
_set_SSE2_enable |
启用或禁用 SSE2 指令 |
signbit |
测试浮点值的符号位 |
.- . | 计算正弦值 |
.- . | 计算双曲正弦值 |
.- . | 计算平方根 |
.- . | 获取浮点状态字 |
%> | 将字符串转换为 float |
%> | 将字符串转换为 long double |
.- . | 计算正切值 |
.- . | 计算双曲正切值 |
.- . | 计算 gamma 函数 |
.- . | 截断小数部分 |
%> | 将宽字符串转换为 double |
.- . | 计算贝塞尔函数 |