[問題] float 和 double 的問題

看板C_and_CPP作者 (sunlights)時間13年前 (2013/01/14 18:27), 編輯推噓0(0017)
留言17則, 4人參與, 最新討論串1/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, , 1F
精確到第7位是說和實際值的差距在10^-7以下
01/14 18:33, 1F

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

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

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

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

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

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

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

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

01/14 23:49, , 10F
.2lf 是取到小數後二位進位四捨五入.
01/14 23:49, 10F
我還是覺得奇怪..如果浮點數存的時候就有誤差(因為只有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, , 11F
二進位小數是a1 * 0.5 + a2 *0.25 + a3 *0.125...
01/15 17:29, 11F

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

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

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

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

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

01/16 22:51, , 17F
去翻 IEEE754, 思考它的四則運算怎麼以二進位方式進行.
01/16 22:51, 17F
※ 編輯: sunlights 來自: 111.240.16.196 (01/17 17:59)
文章代碼(AID): #1GyzsZqe (C_and_CPP)
文章代碼(AID): #1GyzsZqe (C_and_CPP)