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