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

标签 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

最佳答案

不,除非你的类或方法是用 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/

相关文章:

Java executor.scheduleAtFixedRate 添加 Delay

java - Android Volley Request中出现网络或超时错误时如何再次调用API

c++ - 三角形面积的浮点难度

c++ - clang 的 `-Ofast` 选项在实际中有什么作用,特别是对于与 gcc 的任何差异?

java - 0.999...相乘时可以四舍五入到1吗?

java - Java文件读取

java - 如何将输入值分配给来自 Controller 类的对象?

c++ - 为什么这个操作没有给我更高的精度?

java - 抽象类以摆脱 Activity 中的冗余代码

floating-point - 定点 MATLAB DSP 算法