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。

更新于: 2019 年 7 月 30 日

212 次浏览

开启你的 职业 生涯

完成课程即可获得认证

开始
广告