看板 C_and_CPP 關於我們 聯絡資訊
事情是這樣的。 有一個不太複雜的算式, 執行的結果照理說要一樣的, 卻不太一樣。 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
stupid0319:x += blah3 + blah4; 跟x += blah3 ;是一樣的 10/10 13:19
nowar100:十一誡 10/10 13:19
看了,但我以為至少問題會出現在 double 的末位, float()後應該看不到差異才對,
stupid0319:請看一下運算符優先順序 10/10 13:19
nowar100:私以為一樓會先做 temp=blah3+blah4 再做 x+=temp; 10/10 13:21
stupid0319:好像我記錯了,上面當作沒看見 10/10 13:25
yauhh:真有趣,是a+b+c+d與(a+b)+(c+d)無法求對等值的毛病. 10/10 13:41
想請教前輩, 那該如何運算才能獲得較為正確的值? ※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 13:47)
sjgau:浮點數的運算,一定會產生誤差。所以,你要做的事情是 10/10 14:00
sjgau:面對他,而不是逃避。你必須了解他的一些事情,如何處理 10/10 14:01
stupid0319:看似簡單的運算,卻有著複雜的過程,真相永遠只有一個 10/10 14:05
yauhh:其實你可以想,既然是平均值,a+b+c+d的結果才是全對嗎? 10/10 14:08
yauhh:或許你要一個稍微正確的平均值,那麼第一寫法也可以用啦. 10/10 14:08
yauhh:除非那個精確值對程式是決定成敗的關鍵,才去解決問題. 10/10 14:10
精度的確是有決定性... 坦白說就是因為誤差, 所以我才會取四值平均.... (本來使用一組常數參數就好, 就是因為一直有誤差, 我才用四組下去跑然後取平均....) 但是實在不知道什麼是對的或精確的... 市面上有這方面的書籍嗎? ※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 15:12)
tropical72:你的研究對於精準度有很大的要求嗎?你的研究對於浮點 10/10 15:51
tropical72:數有很頻繁的運算嗎? 10/10 15:52
我是在開發自己的一些resampler的演算法, 原始資料是 float, 用 double 運算是為了提高精確度, 但經過軟體分析後發現好像精確度還沒有push到極限, 改用 long double 也完全沒有任何變化.... 至於頻繁...嗯, 還滿頻繁的 @@ ※ 編輯: wahaha99 來自: 220.132.126.29 (10/10 16:17)
yauhh:參考書籍請先找數值分析書籍看一看 10/10 21:55