看板 C_and_CPP 關於我們 聯絡資訊
: 比如你可能會寫 if (aDouble == bDouble) {...} : 同理,因為 double 是約數,所以明明是相等的情況,用 == : 也可能會變成不相等。解決方法嘛,和上面類似,定好小數位 8 : 位後,定義 const double EPSILON = 0.000000001; : if (aDouble == bDouble) 改為 : if (aDouble < bDouble + EPSILON && aDouble > bDouble -EPSILON) : 有人寫 if (fabs(aDouble-bDouble) < EPSILON) 意思也是一樣 這邊我有一個疑問 EPSILON要設定多少, 是不是跟所計算的double有關 ? 我自己寫個小測試程式 #include <stdio.h> #include <math.h> #define EPSILON 0.001 int main(){ double a = 43000000000000.81; double b = 7000000000000.51 + 36000000000000.30; if( fabs( a - b ) < EPSILON ) printf("equal\n"); else printf("not equal\n"); getchar(); return 0; } EPSILON設定為0.001時, 螢幕輸出not equal EPSILON設定為0.01時, 營幕輸出equal 這個我可以理解, 因為fabs(a - b)後的有效數字為 0.00???? (?為非有效位數) 不過標準函式庫好像沒有什麼提供什麼其他的方法可用來比較浮點數 我試math.h的islessgreater()也沒辦法用在這個例子上 而且islessgreater()也不是個通用的方法 (網路上有人說MSVC上沒有, 但我沒去試) 不然就要include一些非標準函式庫的東西.... ### 另一個問題 ### 測試的過程中, 發現(a), (b), (c)的結果不太一樣 但不太懂是哪裡產生差異 ??? @@ (a) #include <stdio.h> #include <math.h> int main(){ double a = 4.381; double b = 0.751 + 3.630; if( a == b ) printf("equal\n"); // 螢幕輸出equal else printf("not equal\n"); getchar(); return 0; } (b) #include <stdio.h> #include <math.h> int main(){ double a = 43.81; double b = 7.51 + 36.30; if( a == b ) printf("equal\n"); else printf("not equal\n"); // 螢幕輸出not equal getchar(); return 0; } (c) #include <stdio.h> #include <math.h> int main(){ double a = 43.081; double b = 7.051 + 36.030; if( a == b ) printf("equal\n"); // 螢幕輸出equal else printf("not equal\n"); getchar(); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.209.20.225
VictorTom:是的, epsolon要設的與要相減的值有關, 因為double運算 07/21 17:06
VictorTom:會以exponent大的為準來算, 所以eps不見得都通用:) 07/21 17:06
VictorTom:糟~~小弟我又不小心暴露了我英文很差的事實....Orz 07/21 17:07
su31o4gj83:那如果遇到需要比較浮點數且無法預期浮點數大小 07/21 18:03
su31o4gj83:那只好加上類似下面的程式碼做判斷嗎? 07/21 18:04
su31o4gj83:http://tinyurl.com/ncsfhq 07/21 18:10
VictorTom:如果值域的exponent無法預期, 又真的要算這麼仔細, 就.. 07/21 18:16
su31o4gj83:soga, 我暸解了, 謝謝你的回覆 07/21 18:32