浮点运算误差


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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值