Re: [問題] float 精準度觀念問題

看板C_and_CPP (C/C++)作者時間6年前 (2018/09/28 11:51), 6年前編輯推噓1(1013)
留言14則, 2人參與, 6年前最新討論串4/4 (看更多)
※ 引述《Feis (坐吃山空)》之銘言: : 標題: Re: [問題] float 精準度觀念問題 : 時間: Wed Sep 19 00:13:10 2018 [deleted] : : 要透過浮點數做運算時大概有三個步驟 : : 1. 將要計算的數字轉換成浮點數可精確表示的格子點 (可能產生誤差) : 2. 對這些在格子點上的數字們做運算 : 3. 將算出來的結果存在浮點數可精確表示的格子點上 (可能產生誤差) [deleted] : : ※ 編輯: Feis (140.122.83.198), 09/19/2018 00:47:44 : 推 cutekid: 大推(Y) 09/19 03:16 : 推 chchwy: 神解答 格子點的解釋很好懂 09/19 08:03 : 推 sarafciel: 推格子點的解釋 09/20 15:14 : 推 lovejomi: 針對那三個步驟,算的時候沒有受到誤差限制反而是算完 09/25 16:59 : → lovejomi: 之後3. 會因為要mapping to ieee754而產生誤差 這邊覺 09/25 16:59 : → lovejomi: 得很神奇 不知道cpu怎麼運算的 09/25 16:59 計算的部份 (2.) 也會有誤差啊 除法除不盡的話本來就一定會有誤差,就算加法乘法這種本來應該可以精確計算 也可能會有誤差 舉例來說,兩個浮點數相乘時,小數以下部份可能會超過浮點數能表示的極限 超過的部份資訊就丟失了,這個部份就是誤差 實務上 CPU 在設計時時會儘量減少計算誤差,作法其實很簡單,就是作弊 例如 x86 系列的 FPU 其實是 80-bit 所以在計算 float (32-bit) 或 double (64-bit) 的過程中就可以保留更多精確位 有興趣的話可以看 IEEE754 extended precision formats 的部份 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.30.51 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1538106711.A.299.html ※ 編輯: HuangTzHuan (140.112.30.51), 09/28/2018 11:53:06

09/28 18:21, 6年前 , 1F
這裡還有一個衍生問題是當編譯器最佳化把中間過程留在 FPU
09/28 18:21, 1F

09/28 18:21, 6年前 , 2F
裡的時候跟沒有最佳化算一個就存回 double 這兩種的結果
09/28 18:21, 2F

09/28 18:22, 6年前 , 3F
就會因為這個問題而產生不同結果
09/28 18:22, 3F

09/28 18:34, 6年前 , 4F
一個例子可以看這則久遠之前的 gcc bug report
09/28 18:34, 4F

09/28 18:34, 6年前 , 5F

10/03 02:45, 6年前 , 6F
不是這樣講,沒有實作80bit浮點的硬體仍然能得到符合iee
10/03 02:45, 6F

10/03 02:45, 6年前 , 7F
e的結果
10/03 02:45, 7F

10/03 02:46, 6年前 , 8F
加減乘的結果都是有限位所以沒問題
10/03 02:46, 8F

10/03 02:50, 6年前 , 9F
除法跟開根號則不同,精確度的規定是算出有限位的結果,
10/03 02:50, 9F

10/03 02:50, 6年前 , 10F
和無限精確的結果,差距在一個ulp內(如果是round2even,
10/03 02:50, 10F

10/03 02:50, 6年前 , 11F
則是半個ulp)
10/03 02:50, 11F

10/03 02:54, 6年前 , 12F
浮點數是實數的有限位表達,根號3浮點化之後再自乘是無
10/03 02:54, 12F

10/03 02:54, 6年前 , 13F
法變回精確的3的,隨著運算誤差有可能會變大,這跟演算
10/03 02:54, 13F

10/03 02:54, 6年前 , 14F
法的穩定度有關
10/03 02:54, 14F
文章代碼(AID): #1RhQLNAP (C_and_CPP)
文章代碼(AID): #1RhQLNAP (C_and_CPP)