浮点加法和乘法是关联的吗?

当我添加三个浮点值并将它们与1进行比较时出现问题。


cout << ((0.7 + 0.2 + 0.1)==1)<<endl;     //output is 0

cout << ((0.7 + 0.1 + 0.2)==1)<<endl;     //output is 1

为什么这些价值观会有所不同?


倚天杖
浏览 570回答 3
3回答

慕尼黑的夜晚无繁华

浮点加法不一定是关联的。如果更改添加顺序,则可以更改结果。关于该主题的标准论文是每位计算机科学家都应了解的浮点算法。它给出以下示例:另一个灰色区域涉及括号的解释。由于舍入误差,代数的关联定律不一定适用于浮点数。例如,当x = 1e30,y = -1e30和z = 1时,表达式(x + y)+ z的答案与x +(y + z)完全不同(前者为1,后者为0) )。

神不在的星期二

在C或C ++中,浮点乘法不相关。证明:#include<stdio.h>#include<time.h>#include<stdlib.h>using namespace std;int main() {&nbsp; &nbsp; int counter = 0;&nbsp; &nbsp; srand(time(NULL));&nbsp; &nbsp; while(counter++ < 10){&nbsp; &nbsp; &nbsp; &nbsp; float a = rand() / 100000;&nbsp; &nbsp; &nbsp; &nbsp; float b = rand() / 100000;&nbsp; &nbsp; &nbsp; &nbsp; float c = rand() / 100000;&nbsp; &nbsp; &nbsp; &nbsp; if (a*(b*c) != (a*b)*c){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("Not equal\n");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; printf("DONE");&nbsp; &nbsp; return 0;}在此程序中,大约30%的时间(a*b)*c不等于a*(b*c)。
打开App,查看更多内容
随时随地看视频慕课网APP