logo
0
0
Login

Floating Point Double-Rounding Test

用于检测目标架构是否存在 x87 80-bit 浮点寄存器导致的 double rounding(双重舍入)问题。

背景

在旧的 x86 架构 上,如果编译器没有启用 SSE 浮点指令,而是使用 x87 FPU(80-bit 扩展精度),浮点计算会先在 80-bit 寄存器中进行,再舍入到 64-bit double,导致:

  • 双重舍入(double rounding)
  • 与 IEEE754 标准不一致
  • 某些数学运算产生微小错误

典型问题示例:

89255.0 / 1e22 != 89255e-22 // 在 x87 上可能出现

为了测试当前架构是否会产生此问题,我们将除法函数放在独立文件中并禁止 inline,从而避免编译器优化影响结果。

构建

默认使用本机 gcc:

make

你也可以指定交叉编译器:

LoongArch64:

make CC=loongarch64-linux-gnu-gcc

ARM64:

make CC=aarch64-linux-gnu-gcc

x86_64:

make CC=x86_64-linux-gnu-gcc

运行测试

./test || echo "correct"

输出示例:

  • ✔ 正常(无 double rounding)
[OK] Floating point arithmetic is correct (no x87 double rounding)
  • ✘ 出现 x87 double rounding
[WARN] Incorrect double rounding detected (likely x87 80-bit FPU)

About

Floating Point Double-Rounding Test

Language
C63.9%
Makefile27.8%
Dockerfile8.3%