天天看点

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

今天在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 这个太扯蛋了。