Re: [問題] float 和 double 的問題

看板C_and_CPP作者 (sunlights)時間13年前 (2013/01/17 18:01), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串2/3 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev C++ 最近在看浮點數的表示法.. 很多書都說範圍是3.4E-38~3.4E+38 但是我看有些網頁用IEEE745的表示法下去算.. 範圍卻是1.2E-38~3.4E+38 不知道那個是正確的呢?? 另外,我在dev上寫了一個小小的運算式 float a=0.01; printf("a*3=%f\n",a*3); printf("a*35=%f\n",a*35); printf("a*353=%f\n",a*353); printf("a*3535=%f\n",a*3535); 結果前面都很正確,但是到了最後一行答案卻變成35.349999 要改成printf("a*3535=%.2f\n",a*3535); 答案才會正確,我記得書上說浮點數精確到小數第7位.. 為什麼才第2位就出問題呢?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.241.53.76

01/14 18:33,
精確到第7位是說和實際值的差距在10^-7以下
01/14 18:33

01/14 18:33,
這跟顯示出來第幾個字元不一樣沒任何關係
01/14 18:33

01/14 19:00,
範圍你的是對的,然後正確應該是要看 float.h , FLT_MIN
01/14 19:00

01/14 19:01,
一般從 IEEE754-32bits 的話,normalize-min 約 1.18E-38
01/14 19:01

01/14 19:05,
然後,書上說「精確到小數7位」全都是概估值,從ieee754來
01/14 19:05

01/14 19:08,
看,32bits-matissa 是 23bits,算法是 (23+1)*log(2)=7.22
01/14 19:08

01/14 21:04,
建議去研究一下 IEEE754 的表示法
01/14 21:04

01/14 23:39,
研究過IEEE754的表示法了..但是為什麼print用.2f就能正
01/14 23:39

01/14 23:41,
確顯示呢??是因為printf會四捨五入嗎??還是其他原因?
01/14 23:41

01/14 23:49,
.2lf 是取到小數後二位進位四捨五入.
01/14 23:49
我還是覺得奇怪..如果浮點數存的時候就有誤差(因為只有23位可存尾數).. 所以存在電腦裡應該0.01是存成0.00999999.... 那在printf("%f",0.01)的時候..應該就會印成0.00999999 可是印的時候..還是0.01啊.. 然後..乘起來的時候也是因為誤差 比如乘3,35,353應該也一樣會有問題為什麼印出來都是正確的? ※ 編輯: sunlights 來自: 111.240.7.24 (01/15 17:24)

01/15 17:29,
二進位小數是a1 * 0.5 + a2 *0.25 + a3 *0.125...
01/15 17:29

01/15 17:29,
有些在十進位能用有限位數表示的東西二進位中不能
01/15 17:29

01/15 17:32,
另外0.009999也可能四捨五入成0.010000再把後面的0砍掉
01/15 17:32

01/15 17:33,
printf本身就是個很神秘的東西
01/15 17:33

01/15 17:36,
然後精確度不是到小數第7位,是總共7位
01/15 17:36

01/15 17:37,
所以你的測試小數下的精確度每個都比上一個少一位
01/15 17:37
最後一行不懂.. ※ 編輯: sunlights 來自: 111.241.55.228 (01/16 18:17)

01/16 22:51,
去翻 IEEE754, 思考它的四則運算怎麼以二進位方式進行.
01/16 22:51
這問題我真的思考很久.. float 0.01=0.00000010100011110101110(取23位)=0.99999904632568359375 (我在本板的一篇"請問在C++中float的儲存值" 看到 float 0.01= 0.00999999977648258209 結果和我算的竟然不同) 3=101 35=100011 353=101100001 3535=110111001111 float 0.01*3 =1.0100011110101110*2^-7 X 1.01*2^2 (小數點後2位) *35 = X 1.00011*2^5 (小數點後5位) *353 = X 1.01100001*2^8(小數點後8位) *3535= X 1.10111001111*2^11(小數點後11位) 這樣乘下來怎麼去看它的結果精確度到幾位? 還有我參考了很多文章..都說乘法時並不是用float下去算是用double 儲存再放到float裡..又更複雜了.. 有人知道怎麼看乘法的精確度嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.240.16.196 ※ 編輯: sunlights 來自: 111.240.16.196 (01/17 18:01)

01/18 01:25, , 1F
參考下面的文...我23位弄錯了..是正規後23位難怪有地方
01/18 01:25, 1F

01/18 01:26, , 2F
出錯
01/18 01:26, 2F
文章代碼(AID): #1GzylmHd (C_and_CPP)
文章代碼(AID): #1GzylmHd (C_and_CPP)