天天看點

浮點運算誤差為什麼浮點數運算會有誤差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 這個太扯蛋了。