線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1193
推到 Plurk!
推到 Facebook!

請教double 類型floating point 計算結果不一樣該如何處理??

尚未結案
YuHeng
一般會員


發表:8
回覆:13
積分:4
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-23 12:51:04 IP:61.56.xxx.xxx 未訂閱
處理double類型的資料時.常會發生計算方式不同而產生不同的結果... 例如下面程式.....
 
   double d[7];
   d[0] = 1.1;   
   d[1] = 2.1;   
   d[2] = 3.1;
   d[3] = 4.1;   
   d[4] = 5.1;   
   d[5] = 6.1;   
   d[6] = 7.1;   
   double a,b;
   a = (d[0] d[1] d[2] d[3] d[4] d[5] d[6])/7.0;
   b=0.0;
   for(int i = 0; i < 7; i  )
      b  = d[i];
   b /= 7.0;
   if(a==b) 
      ShowMessage("True");
   else
      ShowMessage("False");       
用debug看,a,b的值為 a=4.09999999999999964 b=4.10000000000000053 雖然顯示時為兩個都是4.1 但做比較時a==b,會為false.... 請問此問題大家有沒碰到?? 該如何處理,可以讓a==b為true?? 我目前是將a,b變為字串,再轉為double... sprintf(s,"%f",a); a=atof(s); 可以解決上面問題. 但有時卻會在sprintf出現Invalid floating point operation.... 而且程式會變慢.... 請問有沒其他較佳方案??? 感謝先!!
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-23 13:04:07 IP:140.112.xxx.xxx 未訂閱
引言: 處理double類型的資料時.常會發生計算方式不同而產生不同的結果... 例如下面程式.....
 
   double d[7];
   d[0] = 1.1;   
   d[1] = 2.1;   
   d[2] = 3.1;
   d[3] = 4.1;   
   d[4] = 5.1;   
   d[5] = 6.1;   
   d[6] = 7.1;   
   double a,b;
   a = (d[0] d[1] d[2] d[3] d[4] d[5] d[6])/7.0;
   b=0.0;
   for(int i = 0; i < 7; i  )
      b  = d[i];
   b /= 7.0;
   if(a==b) 
      ShowMessage("True");
   else
      ShowMessage("False");       
用debug看,a,b的值為 a=4.09999999999999964 b=4.10000000000000053 雖然顯示時為兩個都是4.1 但做比較時a==b,會為false.... 請問此問題大家有沒碰到?? 該如何處理,可以讓a==b為true?? 我目前是將a,b變為字串,再轉為double... sprintf(s,"%f",a); a=atof(s); 可以解決上面問題. 但有時卻會在sprintf出現Invalid floating point operation.... 而且程式會變慢.... 請問有沒其他較佳方案??? 感謝先!!
    if(  (int)((a-b)*100) == 0   )
    ....    //your code    或    #define MY_EQUAL(a,b) (int)((a-b)*100)==0
 
如果要精確到小數以下兩位就乘以100,三位就乘以1000 未經測試...試用看看
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-23 14:33:39 IP:61.226.xxx.xxx 未訂閱
YuHeng您好: 請參考以下的程式碼,視需求自行修改
 
  請將->double a,b,d[7];
  改成->long double a,b,d[7];      //察看a,b的內容
  Edit1->Text = FloatToStrF(a,ffFixed,18,ffFixed);
  Edit2->Text = FloatToStrF(b,ffFixed,18,ffFixed);    
◎天長地久有時盡,追求知識無絕期!
YuHeng
一般會員


發表:8
回覆:13
積分:4
註冊:2003-02-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-26 23:04:46 IP:61.56.xxx.xxx 未訂閱
感謝pwipwi與g6101兩位的回應... 因程式修改上pwipwi的方法,我在修改程式上, 需動到的地方的最少,因此給分給pwipwi.. 我有再測試過 float與 long double,無此問題.... 僅有double會出現此問題...........
johnny149
一般會員


發表:0
回覆:13
積分:2
註冊:2004-03-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-28 11:45:40 IP:218.161.xxx.xxx 未訂閱
雖然已經有人得分了,不過我想提供一下我的想法供您參考。    因為浮點數天生就有誤差,所以一定要 等於 是會出問題的。 不如將充許誤差設一範圍,如果差值在範圍內即視為相同。 sx = fabs( sa-sb ); if ( sx<0.001 ) // they are equal!
系統時間:2024-07-04 2:38:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!