作者LPH66 ((short)(-15074))
看板C_and_CPP
標題Re: [問題] 浮點數的殘值
時間Thu Nov 12 15:33:01 2009
※ 引述《TIME1987 (把握當下)》之銘言:
: 遇到的問題:float與double在位數上的不同
: #include <stdio.h>
: int main()
: {
: float num1=123.456789012345;
: double num2=123.456789012345;
: printf("num1=%16.12f\n",num1);
: printf("num2=%16.12f",num2);
: return 0;
: }
: 程式跑出來的結果:num1=123.456787109375
: num2=123.456789012345
: 開發平台:codeblock
: float只能容納4個位元組 所以是8個位數的精度
: 但為何num1=123.456787109375從第8位之後的數字會是這麼不規律呢?
: 書上說是記憶體的殘值 但這個殘值是怎麼出來的呢?
: 謝謝~
其實不是殘值
是被切掉的二進位所代表的誤差值
例如 0.123 好了 它的二進位是 0.00011111011111001110110110010001011...
\_____ 這裡一共24位 ____/
如果我只要二進位小數有效位數24位
(和 float 一樣; 為何不是23位是標準表示法有藏一個1沒有紀錄)
那麼就會變成 0.0001111101111100111011011001
精確轉回十進位是 0.1229999996721744537353515625
注意到二進位的24位約等於十進位的 24log2=7.22 位
所以切在有效位數是 0.1230000 的確達到了位數
後面那些亂七八糟的數字就是在那之後被切掉的數字所代表的誤差值而已
也就是說 十進位七位以後的數字都不準 能相信的就是七位精確而已
--
'Oh, Harry, dont't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.92
※ 編輯: LPH66 來自: 140.112.28.92 (11/12 15:34)
推 TIME1987:謝謝你~ 11/12 15:34
推 VictorTom:小弟我一直以為是六位精確, log2 * mentisa bit數Orz 11/12 16:58
推 lairrol:7位沒錯!!這個我試過....當要比較兩個浮點數發現的=.=" 11/12 19:19
→ lairrol:不過第七位有時候也會有誤差就是了 xx.xxx1 和 xx.xxx0 囧 11/12 19:20
→ LoveCheer:高手 11/12 20:01
推 VictorTom:3F~~第七位有時會有誤差, 那就是六位精確而已啊?_? 11/12 20:29
→ LPH66:咦等等我發現我多算一位 float 的 mantissa 是 23 bit 11/13 02:12
→ LPH66:不過這樣改也是7.2...應該還不會少到剩六位 11/13 02:13
→ LPH66:三樓可能是你有一位整數的關係... 11/13 02:13
※ 編輯: LPH66 來自: 140.112.28.92 (11/13 02:15)
→ LPH66:7位是有效位數喔 不是小數位數..所以有1位整數時小數就剩6位 11/13 02:16
推 lairrol:我自己try的例子是 1.xxxxxx1 0.xxxxxx0 會這樣... 11/13 03:23
→ lairrol:嗯~LPH說的應該沒錯~我試完是整數位1位+小數位6位精確 11/13 03:23
推 VictorTom:對喔~~我忘記了整數的那一位....Orz 11/13 08:34
推 photon3108:23bits 會有正規化之後,變成可表達24bits的關係嗎?, 11/13 12:26
推 photon3108:gcc, vc 都定義 FLT_DIG <cfloat> 是 6,怎麼少1個 11/13 12:32