Re: [問題] 如何直接判斷浮點數運算時的誤差?(贈P幣)
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章