gpt4 book ai didi

java - JIT处理浮点运算是否带/F :fast or/F:precise

转载 作者:行者123 更新时间:2023-11-29 04:22:40 25 4
gpt4 key购买 nike

在 C++ 优化器中,您可以指定使用快速浮点运算而不是精确浮点运算。不同之处在于,在快速模式下,它会进行适用于现实世界数学的优化,但在计算机上完成时可能不会产生正确的结果。

可以使用 GodBolt 使用以下代码和 -O2 优化来展示这方面的示例。如果您使用的是 clang 或 gcc,则可以放入 -ffast-math 参数来查看这些优化后的代码。

double mulBy6DivBy12(double x)
{ return 6 * x / 12; }

double divBy2(double x)
{ return x / 2; }

如果没有 -ffast-math 参数,它将在 mulBy6DivBy12 函数中生成乘法和除法运算,在两个函数中看起来是一样的。

我想知道的是在运行时,当被 JIT 处理时,它是否进行了这些潜在的不安全优化?

最佳答案

Java 语言规范中有两个有趣的陈述。

第一个是广义的in JLS section 15.7 :

15.7. Evaluation Order

The Java programming language guarantees that the operands ofoperators appear to be evaluated in a specific evaluation order,namely, from left to right.

这已经是完全的保证了;即使可以按任何顺序执行,它们也必须看起来在从左到右的评估顺序中。浮点运算的重新排序会破坏这种外观,因此这是不允许的。

其次,有专门针对浮点运算的保证in JLS section 4.2.4 :

The Java programming language requires that floating-point arithmeticbehave as if every floating-point operator rounded its floating-pointresult to the result precision. Inexact results must be rounded to therepresentable value nearest to the infinitely precise result; if thetwo nearest representable values are equally near, the one with itsleast significant bit zero is chosen. This is the IEEE 754 standard'sdefault rounding mode known as round to nearest.

这清楚地阐明了每个(从左到右)操作应该如何舍入其结果。这也不允许任何重新排序,如果您以从左到右的顺序执行操作,则会改变计算结果。

关于java - JIT处理浮点运算是否带/F :fast or/F:precise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48143215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com