今天在gpu实现数组求和的功能,发现竟然跟cpu的结果不一样。
然后各种查资料。
原来误差产生有多方面的原因。
就我那个程序来说,原因之一就是 cpu和gpu加法的顺序不一样,而浮点运算是不支持结合律的。
参考资料:
为什么浮点数运算会有误差http://evol128.is-programmer.com/posts/29552.html
【讨论】为啥0.2+0.4 != 0.6(浮点数计算的精度问题) http://thihy.iteye.com/blog/1867577
误差的来源:
- 浮点数表示可能存在Round
- 浮点数计算可能存在Round
- 结果输出时可能存在Round
再来几个有趣的测试:
测试一: 0.2+0.4!=0.6
int main(void)
{
float a = 0.2;
floatb = 0.4;
float c= a+b;
cout<<(c==0.6)<<endl;
return 0;
}
输出是:0
测试二:
int main(void)
{
float a,b,c;
a = 1234.567;
b = 45.67834;
c= a+b;
printf("%f\n",c);
cout<<(c==1280.245361)<<endl;
return 0;
}
输出是: 1280.245361
0 这个太扯蛋了。