C、C++ 和 Java 中的浮点运算和结合律
在 C、C++ 和 Java 中,我们对浮点数执行一些数学运算。现在,我们将在其中检查浮点数是否遵循结合律。
答案是:否。在某些情况下,浮点数不能遵循结合律。这里,我们将看到一些示例。
示例代码
#include<iostream> using namespace std; main() { float x = -500000000; float y = 500000000; float z = 1; cout << "x + (y + z) is: " << x + (y + z) << endl; cout << "(x + y) + z is "<< (x + y) + z << endl; }
输出
x + (y + z) is: 0 (x + y) + z is 1
在这里,我们可以看到结果不同,但是理论上可以讲它们始终为 1。那么问题来了,这是如何实现的?
在第一种情况下,执行 (500000000 + 1)。但是对于浮点数舍入,它又转换为 500000000。现在,通过添加 -500000000,它变为 0。在第二个表达式中,值为 (-500000000 + 500000000) = 0,然后添加 1,因此最终结果为 1。
如果我们使用整数,则两个表达式都将返回相同的结果 1。
广告