当我添加三个浮点值并将它们与1进行比较时出现问题。cout << ((0.7 + 0.2 + 0.1)==1)<<endl; //output is 0cout << ((0.7 + 0.1 + 0.2)==1)<<endl; //output is 1为什么这些价值观会有所不同?
3 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
浮点加法不一定是关联的。如果更改添加顺序,则可以更改结果。
关于该主题的标准论文是每位计算机科学家都应了解的浮点算法。它给出以下示例:
另一个灰色区域涉及括号的解释。由于舍入误差,代数的关联定律不一定适用于浮点数。例如,当x = 1e30,y = -1e30和z = 1时,表达式(x + y)+ z的答案与x +(y + z)完全不同(前者为1,后者为0) )。
神不在的星期二
TA贡献1963条经验 获得超6个赞
在C或C ++中,浮点乘法不相关。
证明:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
int main() {
int counter = 0;
srand(time(NULL));
while(counter++ < 10){
float a = rand() / 100000;
float b = rand() / 100000;
float c = rand() / 100000;
if (a*(b*c) != (a*b)*c){
printf("Not equal\n");
}
}
printf("DONE");
return 0;
}
在此程序中,大约30%的时间(a*b)*c不等于a*(b*c)。
- 3 回答
- 0 关注
- 569 浏览
添加回答
举报
0/150
提交
取消