Re: [問題] 浮點數的殘值
※ 引述《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)
推
11/12 15:34, , 1F
11/12 15:34, 1F
推
11/12 16:58, , 2F
11/12 16:58, 2F
推
11/12 19:19, , 3F
11/12 19:19, 3F
→
11/12 19:20, , 4F
11/12 19:20, 4F
→
11/12 20:01, , 5F
11/12 20:01, 5F
推
11/12 20:29, , 6F
11/12 20:29, 6F
→
11/13 02:12, , 7F
11/13 02:12, 7F
→
11/13 02:13, , 8F
11/13 02:13, 8F
→
11/13 02:13, , 9F
11/13 02:13, 9F
※ 編輯: LPH66 來自: 140.112.28.92 (11/13 02:15)
→
11/13 02:16, , 10F
11/13 02:16, 10F
推
11/13 03:23, , 11F
11/13 03:23, 11F
→
11/13 03:23, , 12F
11/13 03:23, 12F
推
11/13 08:34, , 13F
11/13 08:34, 13F
推
11/13 12:26, , 14F
11/13 12:26, 14F
推
11/13 12:32, , 15F
11/13 12:32, 15F
討論串 (同標題文章)