使用基于 LLVM 的编译器的算术运算结果不正确

Incorrect result of arithmetic operations using LLVM-based compilers

代码:

float fff = 255.0f;
float a0 = (fff / 255.0f) * 100.0f;

如果我使用基于 LLVM 的编译器(例如 Intel C++ 编译器或 clang),变量 a0 等于 100.000008,但如果我使用 g++ 编译器,我得到正确的结果 - 100。 为什么基于 LLVM 的编译器 return 会产生错误的结果?如何解决?我不能只切换到 g++ 因为这个有 LLVM 编译器没有的其他错误。

我对 LLVM 编译器了解不多,但是你得到 100.000008 很奇怪,因为你只有整数,即使在中间结果中也是如此。然而,即使使用 G++,由于计算中的(二进制)舍入误差,您仍然不应该依赖于获得浮点类型计算的准确结果,这不是常规类型的情况(注意常规类型 - 我的意思是那就是你不会有四舍五入但截断 - 浮点部分被忽略) 例如,尝试在 g++ 中使用 0.1,您会注意到结果不是 0.1(如果您查看调试器或将 0.1f 与 0.1 进行比较,cout 或 printf 将不会显示足够的小数位) Rounding error

现在如果你想比较 2 个浮点数而不看绝对差是否低于 epsilon,我建议你使用常规 int 类型乘以某个预分频器 (x10^n) 然后使用例如,数字的最后3位作为浮点数部分,比如不比较伏特,而是比较毫伏或微伏,然后在你想要的时候去掉最后的预分频器(重铸成之前的float/double)打印结果。