[英]C++ Looping with doubles
為什么在下面的代碼中 PRINT THIS 從不打印? 我已經 cout << shiftx 和 shifty 以確保在某些時候它們都是 0.3。
for(double shifty=0; shifty < 2; shifty+=.1) {
for(double shiftx=0; shiftx < 2; shiftx +=.1) {
if((shiftx == 0.3) && (shifty == 0.3)) {
cout << "PRINT THIS" << endl;
}
}
}
黃金法則是:避免在浮點中進行相等測試。
0.1 和 0.3 都不能精確表示。
標准閱讀: 每個計算機科學家都應該知道的關於浮點運算的知識。
要解決您的特定問題,您應該使用 integer 類型進行迭代並執行比較。 僅在實際需要時轉換為浮點類型。 例如:
for(int shifty=0; shifty < 20; shifty++) {
for(int shiftx=0; shiftx < 20; shiftx++) {
double shifty_double = shifty * 0.1;
double shiftx_double = shiftx * 0.1;
if((shiftx == 3) && (shifty == 3)) {
cout << "PRINT THIS" << endl;
}
}
}
這可能是由於使用雙精度數時的舍入錯誤,因為 0.3 實際上並沒有在內部完全存儲為 0.3。
比較雙打的一種方法是在比較中允許一些錯誤。 例子
if(abs(shiftx - shifty) < 0.000001)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.