Re: [問題] 如何直接判斷浮點數運算時的誤差?(贈P幣)

看板Programming作者 (煉獄乂暴龍)時間6年前 (2018/12/04 15:25), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《baobao566 (寶寶)》之銘言: :   為了這個問題困擾了許久,不斷地查資料,查完這個觀念,又看到新的名詞與此題 : 有關聯。以我查到的資料VB.Net在浮點數運算時會將數字以IEEE754來標準來做,預設的 : 浮點數型態是Double,所以是64位,有誤差是因為將他轉成2進制,小數部分如果無限 : 循環,取到53位往最靠近的捨入(Round to nearest),二進制的這個模式我不太懂, : 翻資料查到的大概又都是英文...。 不管是哪個程式、電腦環境,浮點數都是使用IEEE754去做的 也就是說,全世界的電腦都有誤差問題 float 1 sign + 8 exponent + 23 mantissa double 1 sign + 11 exponent + 52 mantissa sign 正負號 0為正 1為負 exponent 指數 mantissa 小數點 舉個例子:0.625 先轉成二進位 2^0 2^-1 2^-2 2^-3 2^-4...... 0 . 1 0 1 0 ......(省略不寫) 0.625 (10) = 0.101 (2) 把2進位用科學記號表示 2^0 * 0.101 2^-1 * 1.01 放進 float 裡面 sign 正 0 exponent -1+127 這裡要加上 127 才能變成float exponent double 就加上 1023 mantissa 0100000000... 合起來就變成 0 01111110 01000000000000000000000 01111110 是 126 的二進位 IEEE754 簡介大致到這裡 因為這只能用在二進位才會有精確性 可以用 0.1 跟 0.2 轉成 IEEE754 格式 https://www.h-schmidt.net/FloatConverter/IEEE754.html 把0.1+0.2加起來問問看電腦是不是等於0.3? :   還有一些環境的因素,我看到一個文件上面說編譯器可能會幫你最佳化運算式, : 例如說x = a+b-a -> x = b,那這題有很多環境的問題,我要如何判斷呢? : (出處:https://goo.gl/oAzyNB Compiler Optimization) 根據小弟在C++的經驗,這要去改編譯器的參數 因為這是在編譯時幫你優化的 是自動幫你省略一些系統覺得沒必要的動作 只能知道某些動作被優化 :   如果判斷此題需要手算,請問有無快速手算判斷的方法?此題是今年高職技藝競 : 賽的程式設計賽前模擬學科試題,有想過他可能只是出經典範例來考你知不知道浮點 : 數有誤差,如果只是這樣就太好了,但是以防萬一還是有個準確判斷的方法比較安心。 : ----更新---- : 沒什麼人解答,如果能解決問題者,贈上全部家產稅前350P : 下面圖兩題答案分別為C、D : https://imgur.com/a/zBQ9pjH : 22. 執行下列 Visual Basic 程式片段,輸出結果為何? (A) 1 (B) 0 (C) True (D) : False Console.WriteLine(1.1 + 1.2 = 2.3) : 23. 執行下列 Visual Basic 程式片段,輸出結果為何? (A) 1 (B) 0 (C) True (D) : False Console.WriteLine(0.3 - 0.2 = 0.1) 如果只是要考浮點數規則 或 計算機概論 這題目還可以 你可以把上面的數字放到我剛剛打的連結 浮點數加減法要先把兩個數字的指數變成相同數字,才能計算 低指數的要去對應高指數 就會有捨棄的問題 但如果是考程式的話,我覺得這有點太超過了,而且意義也不大 小弟拙見僅供參考 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.69.47 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1543908353.A.12B.html
文章代碼(AID): #1S1Ym14h (Programming)
文章代碼(AID): #1S1Ym14h (Programming)