請教double 類型floating point 計算結果不一樣該如何處理?? |
尚未結案
|
YuHeng
一般會員 發表:8 回覆:13 積分:4 註冊:2003-02-26 發送簡訊給我 |
處理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 發送簡訊給我 |
引言: 處理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 發送簡訊給我 |
|
YuHeng
一般會員 發表:8 回覆:13 積分:4 註冊:2003-02-26 發送簡訊給我 |
|
johnny149
一般會員 發表:0 回覆:13 積分:2 註冊:2004-03-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |