数学和浮点支持
通用 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
版本,但请注意,二进制表示形式可能不同于其他编译器。
受支持的数学和浮点例程
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈