作者tyc5116 (累人啊....)
看板C_and_CPP
標題[問題] 浮點數的誤差
時間Thu Aug 29 09:42:10 2013
如題,我對於浮點數誤差的觀念好像有錯
貼上一小段code,作為發問的問題
const double rate1 = 3733.333333;
const float rate2 = 3733.333333;
double val1 = 90.003;
float val2 = 90.003;
cout<<setprecision(7);
cout<<fixed;
cout<<"double * double "<<val1* rate1<<endl
<<"double * float "<<val1* rate2<<endl
<<"float * double "<<val2* rate1<<endl
<<"float * float "<<val2* rate2<<endl;
得到結果為
double * double 336011.1999700
double * float 336011.1926755
float * double 336011.1938177
float * float 336011.1875000
再參考
http://squall.cs.ntou.edu.tw/cprog/Materials/VariableTypes.html
我原本以為小數點後7位以內,四個出來的結果應該要一樣
頂多遇到進位,第7位會有不同,但上面的例子,在第2位就開始出現不同了
以下是我原本想的觀念
運算時會將type轉為double * double 運算完後再根據回傳的type再作一次轉型
例如float * float在運算的過程中就是
float*float->double*double->float*float=float
原type 計算時的type 回傳時的type
看來這觀念應該是錯的,而且我本來想說不管怎樣
double* float和float* double也應該要一樣,顯然也不是
想請高手詳細的說明一下,謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.238.4
→ tyc5116:z-8-12我有看過了,可是感覺有哪裡拼不起來..@@ 08/29 09:45
→ azureblaze:所謂的「精度」不是到小數點後幾位 08/29 09:52
→ azureblaze:而是從最高位開始有幾位 08/29 09:52
→ azureblaze:所以的小數點第一位其實已經是第七位了 08/29 09:53
推 LPH66:這是「小數位數」跟「有效位數」的差別 08/29 09:59
→ LPH66:float 的七位或 double 的十五位都是「有效位數」 08/29 10:00
→ LPH66:寫成科學記號應該比較好理解問題在哪: rate = 3.733333333e3 08/29 10:01
→ LPH66:這樣 float 的七位就是 3.733333|333e3 => 3733.333|333 08/29 10:02
推 Favonia:原PO貼的網站有許多錯誤...(因為都寫一大篇文章了懶得列xD 08/29 12:02
推 LPH66:嘛, 那網站的最後更新時間是 15 年前所以...(茶) 08/29 13:25
→ MOONRAKER:這太誇張了 居然現在還有這種Web 0.2時期的網站 08/29 13:30
→ tyc5116:謝謝,另外,那網站是我隨便google找到的… 08/29 13:51
→ longlongint:計概裡面有IEEE754 去看計概 09/06 11:28