看板 C_and_CPP 關於我們 聯絡資訊
如題,我對於浮點數誤差的觀念好像有錯 貼上一小段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