如果数字相等,我可以确定对它们进行任何数学运算的结果也相等吗?

时间:2013-05-28 06:39:34

标签: java floating-point

假设我有六个号码: 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

1 个答案:

答案 0 :(得分:2)

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

如果将类或方法声明为strictfp,则浮点运算的行为已明确定义,并且必须在Java VM内以及跨不同平台(Java Language Specification $15.4)保持一致

如果使用strictfp声明类或方法 ,则允许Java VM使用浮点算法的平台或硬件特定函数,以便以可预测性为代价获得更好的性能。由于在这种情况下JLS甚至不要求在同一个VM中保持一致性,这意味着如果多次执行完全相同的计算,则允许相同的VM产生不同的结果。我会...假设至少比较解释的字节代码和JIT编译的字节码将或至少可能产生不同的结果。因此,即使表达式a * b + c == a2 * b2 + c2的双方评估不同结果的可能性很小,JLS也允许这样做。