Re: [問題] float 和 double 的問題
開發平台(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,
01/14 18:33
→
01/14 18:33,
01/14 18:33
→
01/14 19:00,
01/14 19:00
→
01/14 19:01,
01/14 19:01
→
01/14 19:05,
01/14 19:05
→
01/14 19:08,
01/14 19:08
→
01/14 21:04,
01/14 21:04
→
01/14 23:39,
01/14 23:39
→
01/14 23:41,
01/14 23:41
→
01/14 23:49,
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,
01/15 17:29
→
01/15 17:29,
01/15 17:29
→
01/15 17:32,
01/15 17:32
→
01/15 17:33,
01/15 17:33
→
01/15 17:36,
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,
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
01/18 01:25, 1F
→
01/18 01:26, , 2F
01/18 01:26, 2F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):