3

假设我有六个数:a、b、c、a2、b2、c2

我知道:

a == a2
b == b2
c == c2

我可以确定在所有平台和 JVM 版本上:

a * b + c == a2 * b2 + c2 // This runs within the same JVM process

假设这个操作的结果是有限的(不是无限的)而不是 NaN

4

1 回答 1

2

不,除非你的类或方法是用strictfp修饰符声明的,否则你不能确定这a * b + c == a2 * b2 + c2是真的。

如果您将您的类或方法声明为strictfp,则浮点运算的行为是明确定义的,并且必须在 Java VM 内以及不同平台之间保持一致(Java 语言规范 $15.4)。

如果类或方法用 声明strictfp,则允许 Java VM 使用平台或硬件特定函数进行浮点运算,以牺牲可预测性来获得更好的性能。由于这种情况下的 JLS 甚至不要求同一 VM 内的一致性,这意味着如果多次执行完全相同的计算,则允许同一 VM 产生不同的结果。例如,我假设至少比较解释的字节码和 JIT 编译的字节码将或至少可能产生不同的结果。因此,即使表达式的两侧a * b + c == a2 * b2 + c2计算出不同结果的可能性非常小,JLS 也允许这样做。

于 2013-05-28T12:12:36.907 回答