Re: [問題] 浮點數的殘值

看板C_and_CPP作者 ((short)(-15074))時間16年前 (2009/11/12 15:33), 編輯推噓8(807)
留言15則, 6人參與, 最新討論串2/3 (看更多)
※ 引述《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
小弟我一直以為是六位精確, log2 * mentisa bit數Orz
11/12 16:58, 2F

11/12 19:19, , 3F
7位沒錯!!這個我試過....當要比較兩個浮點數發現的=.="
11/12 19:19, 3F

11/12 19:20, , 4F
不過第七位有時候也會有誤差就是了 xx.xxx1 和 xx.xxx0 囧
11/12 19:20, 4F

11/12 20:01, , 5F
高手
11/12 20:01, 5F

11/12 20:29, , 6F
3F~~第七位有時會有誤差, 那就是六位精確而已啊?_?
11/12 20:29, 6F

11/13 02:12, , 7F
咦等等我發現我多算一位 float 的 mantissa 是 23 bit
11/13 02:12, 7F

11/13 02:13, , 8F
不過這樣改也是7.2...應該還不會少到剩六位
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
7位是有效位數喔 不是小數位數..所以有1位整數時小數就剩6位
11/13 02:16, 10F

11/13 03:23, , 11F
我自己try的例子是 1.xxxxxx1 0.xxxxxx0 會這樣...
11/13 03:23, 11F

11/13 03:23, , 12F
嗯~LPH說的應該沒錯~我試完是整數位1位+小數位6位精確
11/13 03:23, 12F

11/13 08:34, , 13F
對喔~~我忘記了整數的那一位....Orz
11/13 08:34, 13F

11/13 12:26, , 14F
23bits 會有正規化之後,變成可表達24bits的關係嗎?,
11/13 12:26, 14F

11/13 12:32, , 15F
gcc, vc 都定義 FLT_DIG <cfloat> 是 6,怎麼少1個
11/13 12:32, 15F
文章代碼(AID): #1A-xel5n (C_and_CPP)
文章代碼(AID): #1A-xel5n (C_and_CPP)