比較Java中相等性的雙精度值。
您可以嘗試使用10 -15數量級的增量值,但是您會注意到某些計算會產生較大的舍入誤差。此外,您進行的操作越多,累積的舍入誤差就越大。
一種特別糟糕的情況是,如果減去兩個幾乎相等的數字,例如1.0000000001-1.0并將結果與??0.0000000001進行比較
因此,幾乎沒有希望找到適用于所有情況的通用方法。您始終必須計算出在特定應用中可以期望的精度,然后如果結果比該精度更接近,則認為結果相等。
例如輸出
public class Main { public static double delta(double d1, double d2) {return Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2)); } public static void main(String[] args) {System.out.println(delta(0.1*0.1, 0.01));System.out.println(delta(1.0000000001 - 1.0, 0.0000000001)); }}
是
1.7347234759768068E-168.274036411668976E-8
間隔算術可用于跟蹤累積的舍入誤差。但是實際上,錯誤間隔過于悲觀,因為有時舍入錯誤也會相互抵消。
解決方法我想從那些double在Java中使用原始相等性有更多經驗的人那里獲得一些建議。使用d1 ==d2兩次雙打d1,d2由于可能的舍入誤差而不夠。
我的問題是:
Java Double.compare(d1,d2) == 0在某種程度上處理舍入錯誤嗎?如1.7文檔中所述,0如果d1數值等于,則返回值d2。有人確定它們在數值上相等是什么意思嗎?
對某些增量值使用相對誤差計算,您會建議使用通用的增量值(不是特定于應用程序)嗎?請參見下面的示例。
以下是考慮相對誤差的用于檢查相等性的通用函數。delta您建議從簡單的+,-,/,*操作中捕獲大多數舍入誤差的價值是什么?
public static boolean isEqual(double d1,double d2) { return d1 == d2 || isRelativelyEqual(d1,d2);}private static boolean isRelativelyEqual(double d1,double d2) { return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1),Math.abs(d2));}
相關文章:
1. node.js - mysql如何通過knex查詢今天和七天內的匯總數據2. mysql 插入數值到特定的列一直失敗3. 360瀏覽器與IE瀏覽器有何區別???4. mysql - 百萬行的表中是否盡量避免使用update等sql語句?5. python - 在使用Pycharm時經常看到如下的樣式,小括號里紅色的部分是什么意思呢?6. Python從URL中提取域名7. javascript - 新浪微博網頁版的字數限制是怎么做的8. 怎么在網頁中設置圖片進行左右滑動9. javascript - 豆瓣的這個自適應是怎么做的?10. javascript - 用jsonp抓取qq音樂總是說回調函數沒有定義
