比較Java中相等性的雙精度值。
您可以嘗試使用10 -15數(shù)量級(jí)的增量值,但是您會(huì)注意到某些計(jì)算會(huì)產(chǎn)生較大的舍入誤差。此外,您進(jìn)行的操作越多,累積的舍入誤差就越大。
一種特別糟糕的情況是,如果減去兩個(gè)幾乎相等的數(shù)字,例如1.0000000001-1.0并將結(jié)果與??0.0000000001進(jìn)行比較
因此,幾乎沒(méi)有希望找到適用于所有情況的通用方法。您始終必須計(jì)算出在特定應(yīng)用中可以期望的精度,然后如果結(jié)果比該精度更接近,則認(rèn)為結(jié)果相等。
例如輸出
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
間隔算術(shù)可用于跟蹤累積的舍入誤差。但是實(shí)際上,錯(cuò)誤間隔過(guò)于悲觀,因?yàn)橛袝r(shí)舍入錯(cuò)誤也會(huì)相互抵消。
解決方法我想從那些double在Java中使用原始相等性有更多經(jīng)驗(yàn)的人那里獲得一些建議。使用d1 ==d2兩次雙打d1,d2由于可能的舍入誤差而不夠。
我的問(wèn)題是:
Java Double.compare(d1,d2) == 0在某種程度上處理舍入錯(cuò)誤嗎?如1.7文檔中所述,0如果d1數(shù)值等于,則返回值d2。有人確定它們?cè)跀?shù)值上相等是什么意思嗎?
對(duì)某些增量值使用相對(duì)誤差計(jì)算,您會(huì)建議使用通用的增量值(不是特定于應(yīng)用程序)嗎?請(qǐng)參見(jiàn)下面的示例。
以下是考慮相對(duì)誤差的用于檢查相等性的通用函數(shù)。delta您建議從簡(jiǎn)單的+,-,/,*操作中捕獲大多數(shù)舍入誤差的價(jià)值是什么?
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));}
相關(guān)文章:
1. Python處理Dict生成json2. (python)關(guān)于如何做到按win+R再輸入文件文件名就可以運(yùn)行?3. 想練支付寶對(duì)接和微信支付對(duì)接開(kāi)發(fā)(Java),好像個(gè)人不可以,怎么弄個(gè)企業(yè)的4. mysql - Sql union 操作5. java - Mybatis 數(shù)據(jù)庫(kù)多表關(guān)聯(lián)分頁(yè)的問(wèn)題6. 急急急!!!求大神解答網(wǎng)站評(píng)論問(wèn)題,有大神幫幫小弟嗎7. javascript - 按鈕鏈接到另一個(gè)網(wǎng)址 怎么通過(guò)百度統(tǒng)計(jì)計(jì)算按鈕的點(diǎn)擊數(shù)量8. python - 如何使用websocket在網(wǎng)頁(yè)上動(dòng)態(tài)示實(shí)時(shí)數(shù)據(jù)的折線圖?9. python - 請(qǐng)問(wèn)這兩個(gè)地方是為什么呢?10. python2.7 - python 正則前瞻 后瞻 無(wú)法匹配到正確的內(nèi)容
