[問題] 我猜不透C的double.....
事情是這樣的。
有一個不太複雜的算式, 執行的結果照理說要一樣的, 卻不太一樣。
double x;
float y;
寫法1:
x = blah1 + blah2;
x += blah3 + blah4;
寫法2:
x = blah1;
x += blah2;
x += blah3;
x += blah4;
寫法3:
x = blah1 + blah2 + blah3 + blah4;
然後結尾會有一個 y = float(x/4);
神秘的事情發生了。 寫法 2 跟 3 , y的答案是一致的, 但寫法 1 就未必。
我並沒有 key 錯任何關鍵字, 因為我處理的是陣列, 一個很大的陣列中,
只有 10 個 項目會出現不同, 而且顯然不同的關鍵是在於進位 (值相差1) 。
我用的是 Microsoft Visual C++ 2008 SP1.
嗯...是否有高手能說說看這樣的誤差, 關鍵點在哪? 怎樣的值比較準確?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.126.29
推
10/10 13:19, , 1F
10/10 13:19, 1F
推
10/10 13:19, , 2F
10/10 13:19, 2F
看了,但我以為至少問題會出現在 double 的末位, float()後應該看不到差異才對,
→
10/10 13:19, , 3F
10/10 13:19, 3F
→
10/10 13:21, , 4F
10/10 13:21, 4F
推
10/10 13:25, , 5F
10/10 13:25, 5F
→
10/10 13:41, , 6F
10/10 13:41, 6F
想請教前輩, 那該如何運算才能獲得較為正確的值?
※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 13:47)
推
10/10 14:00, , 7F
10/10 14:00, 7F
→
10/10 14:01, , 8F
10/10 14:01, 8F
推
10/10 14:05, , 9F
10/10 14:05, 9F
推
10/10 14:08, , 10F
10/10 14:08, 10F
→
10/10 14:08, , 11F
10/10 14:08, 11F
→
10/10 14:10, , 12F
10/10 14:10, 12F
精度的確是有決定性... 坦白說就是因為誤差, 所以我才會取四值平均....
(本來使用一組常數參數就好, 就是因為一直有誤差, 我才用四組下去跑然後取平均....)
但是實在不知道什麼是對的或精確的... 市面上有這方面的書籍嗎?
※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 15:12)
→
10/10 15:51, , 13F
10/10 15:51, 13F
→
10/10 15:52, , 14F
10/10 15:52, 14F
我是在開發自己的一些resampler的演算法, 原始資料是 float,
用 double 運算是為了提高精確度, 但經過軟體分析後發現好像精確度還沒有push到極限,
改用 long double 也完全沒有任何變化.... 至於頻繁...嗯, 還滿頻繁的 @@
※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 16:17)
→
10/10 21:55, , 15F
10/10 21:55, 15F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章