※ 引述《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++的經驗,這要去改編譯器的參數
因為這是在編譯時幫你優化的
是自動幫你省略一些系統覺得沒必要的動作
只能知道某些動作被優化
: 如果判斷此題需要手算,請問有無快速手算判斷的方法?此題是今年高職技藝競
: 賽的程式設計賽前模擬學科試題,有想過他可能只是出經典範例來考你知不知道浮點
: 數有誤差,如果只是這樣就太好了,但是以防萬一還是有個準確判斷的方法比較安心。
: