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