用于检测目标架构是否存在 x87 80-bit 浮点寄存器导致的 double rounding(双重舍入)问题。
在旧的 x86 架构 上,如果编译器没有启用 SSE 浮点指令,而是使用 x87 FPU(80-bit 扩展精度),浮点计算会先在 80-bit 寄存器中进行,再舍入到 64-bit double,导致:
典型问题示例:
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"
输出示例:
[OK] Floating point arithmetic is correct (no x87 double rounding)
[WARN] Incorrect double rounding detected (likely x87 80-bit FPU)