我知道浮点运算很棘手,但是我不确定如果你有一个除法后跟反向乘法是否有可能出错。用代码编写,这个方法可能会返回false
:
public boolean calculate(float a, float b) {
float c = a / b;
return (a == (c * b));
}
答案 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
。