假设我有六个双数: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 Language Specification $15.4 ).
如果类或方法未用strictfp
声明,则允许 Java VM 使用平台或硬件特定函数进行浮点运算以获得更好的性能可预测性成本。由于本例中的 JLS 甚至不要求同一 VM 内的一致性,这意味着如果多次执行完全相同的计算,则允许同一 VM 产生不同的结果。我会例如假设至少比较解释的字节码和 JIT 编译的字节码会或至少会产生不同的结果。因此,即使公认表达式 a * b + c == a2 * b2 + c2
的两侧计算出不同的结果的可能性很小,JLS 也允许这样做。
关于java - 如果数字相等,我可以确定对它们进行的任何数学运算的结果也相等吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16785401/