假设我有六个双数: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
假设我有六个双数: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
不,除非你的类或方法是用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 也允许这样做。