浮点运算误差


今天在gpu实现数组求和的功能,发现竟然跟cpu的结果不一样。

然后各种查资料。


原来误差产生有多方面的原因。

就我那个程序来说,原因之一就是 cpu和gpu加法的顺序不一样,而浮点运算是不支持结合律的。


参考资料:

为什么浮点数运算会有误差http://evol128.is-programmer.com/posts/29552.html

【讨论】为啥0.2+0.4 != 0.6(浮点数计算的精度问题) http://thihy.iteye.com/blog/1867577


    误差的来源:
  1. 浮点数表示可能存在Round
  2. 浮点数计算可能存在Round
  3. 结果输出时可能存在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
这个太扯蛋了。











你可能感兴趣的:(浮点运算,误差)