簡體   English   中英

C++ 雙打循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM