在这种情况下是否可能出现浮点错误?

时间:2014-12-28 20:29:38

标签: java floating-accuracy floating-point-precision

我知道浮点运算很棘手,但是我不确定如果你有一个除法后跟反向乘法是否有可能出错。用代码编写,这个方法可能会返回false

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

3 个答案:

答案 0 :(得分:4)

简单的答案是 - 是的。这个例子肯定会返回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等

答案 1 :(得分:3)

您可以自行查看此类案例。例如,使用此代码:

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

答案 2 :(得分:0)

calculate(0,0)

返回false,因为c的值为NaN,因此c * b也是NaN,但a为0,不等于NaN