启用优化后的不同浮点结果:深入了解编译器行为
在处理浮点运算时,必须了解因编译器优化而可能出现的细微差别。如提供的代码片段所示,不同的优化级别可能会在浮点计算的精度方面产生意想不到的结果。
调查和解释
代码旨在舍入将双精度浮点值转换为指定数字。但是,在 g 中启用优化后,结果会偏离预期输出。此行为源于以下事实:Intel x86 处理器内部利用扩展精度(80 位)进行浮点计算。相反,双精度变量通常占用 64 位。
禁用优化 (O0) 时,编译器将浮点值存储在内存中,确保保留 80 位精度。然而,在启用优化 (O1-O3) 的情况下,编译器通过将值保留在寄存器中来利用处理器的扩展精度。当值最终存储回内存中并从 80 位精度转换为 64 位精度时,此优化可能会导致舍入误差。
分辨率选项
缓解对于此问题,建议采用以下解决方案:
进一步注意事项:
关于 Visual Studio 2008
代码产生正确结果的奇怪观察即使在 Visual Studio 2008 中启用 /fp:fast 优化,结果也证明了编译器在这种情况下的可靠性。虽然通常建议对 g 使用 -float-store 选项,但 Visual Studio 2008 似乎可以更有效地处理此问题。
以上是为什么启用编译器优化后浮点计算会有所不同?的详细内容。更多信息请关注PHP中文网其他相关文章!