[問題] 我猜不透C的double.....

看板C_and_CPP (C/C++)作者 (此方不可長)時間15年前 (2010/10/10 13:07), 編輯推噓6(609)
留言15則, 5人參與, 最新討論串1/1
事情是這樣的。 有一個不太複雜的算式, 執行的結果照理說要一樣的, 卻不太一樣。 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
x += blah3 + blah4; 跟x += blah3 ;是一樣的
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
私以為一樓會先做 temp=blah3+blah4 再做 x+=temp;
10/10 13:21, 4F

10/10 13:25, , 5F
好像我記錯了,上面當作沒看見
10/10 13:25, 5F

10/10 13:41, , 6F
真有趣,是a+b+c+d與(a+b)+(c+d)無法求對等值的毛病.
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
其實你可以想,既然是平均值,a+b+c+d的結果才是全對嗎?
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
文章代碼(AID): #1CiKe4Au (C_and_CPP)
文章代碼(AID): #1CiKe4Au (C_and_CPP)