[問題] 浮點數的誤差

看板C_and_CPP (C/C++)作者 (累人啊....)時間12年前 (2013/08/29 09:42), 編輯推噓3(3010)
留言13則, 6人參與, 最新討論串1/1
如題,我對於浮點數誤差的觀念好像有錯 貼上一小段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

08/29 09:45, , 1F
z-8-12我有看過了,可是感覺有哪裡拼不起來..@@
08/29 09:45, 1F

08/29 09:52, , 2F
所謂的「精度」不是到小數點後幾位
08/29 09:52, 2F

08/29 09:52, , 3F
而是從最高位開始有幾位
08/29 09:52, 3F

08/29 09:53, , 4F
所以的小數點第一位其實已經是第七位了
08/29 09:53, 4F

08/29 09:59, , 5F
這是「小數位數」跟「有效位數」的差別
08/29 09:59, 5F

08/29 10:00, , 6F
float 的七位或 double 的十五位都是「有效位數」
08/29 10:00, 6F

08/29 10:01, , 7F
寫成科學記號應該比較好理解問題在哪: rate = 3.733333333e3
08/29 10:01, 7F

08/29 10:02, , 8F
這樣 float 的七位就是 3.733333|333e3 => 3733.333|333
08/29 10:02, 8F

08/29 12:02, , 9F
原PO貼的網站有許多錯誤...(因為都寫一大篇文章了懶得列xD
08/29 12:02, 9F

08/29 13:25, , 10F
嘛, 那網站的最後更新時間是 15 年前所以...(茶)
08/29 13:25, 10F

08/29 13:30, , 11F
這太誇張了 居然現在還有這種Web 0.2時期的網站
08/29 13:30, 11F

08/29 13:51, , 12F
謝謝,另外,那網站是我隨便google找到的…
08/29 13:51, 12F

09/06 11:28, , 13F
計概裡面有IEEE754 去看計概
09/06 11:28, 13F
文章代碼(AID): #1I7gRs2d (C_and_CPP)
文章代碼(AID): #1I7gRs2d (C_and_CPP)