簡體   English   中英

在這種情況下是否可能出現浮點錯誤?

[英]Is it possible to get floating point error in this case?

我知道浮點運算是棘手的,但我不確定如果你有一個除法后跟反向乘法是否有可能出錯。 用代碼編寫,這個方法可能會返回false

public boolean calculate(float a, float b) {
        float c = a / b;
        return (a == (c * b));
}

簡單的答案是 - 是的。 這個例子肯定會返回false:

public boolean alwaysFalse(){
        float a=Float.MIN_VALUE;
        float b=Float.MAX_VALUE;
        float c = a / b;
        return a == c * b;
}

更新
更一般的答案是,在您的方法中發生false情況有兩種情況:
1)當有效數據溢出時(即除數評估的數字比有效數字更多)
2)在指數達到最小值之后,你不能在不丟失最低有效位數的情況下進一步划分

您可以構造保證為false的' a '的示例 - 例如當有效數據的最高和最低有效位為1(二進制)時:10000 ... 000001e10等

你可以自己檢查一下這種情況。 例如,使用此代碼:

public class Main {


    public static void main(String[] args) {
        for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
            for (int j = Integer.MIN_VALUE; j < Integer.MAX_VALUE; j++) {
                if (!calculate(i, j))
                    System.out.println(i + " " + j);
            }
        }

    }

    public static boolean calculate(float a, float b) {
        float c = a / b;

        return (a == (c * b));
    }
}

這會返回許多情況,例如:

1 - 6957633
1 - 6957635
1 - 6957644

是。

calculate(0,0)

返回false因為c將具有值NaN ,因此c * b也將是NaN ,但是a是0,它不等於NaN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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