簡體   English   中英

使用java.math.BigDecimal避免浮點精度問題

[英]Avoid floating point precision issue using java.math.BigDecimal

我有一個由雙精度值(從0到1)填充的矩陣。 為了方便起見,讓我們討論行和列。 我想對矩陣的double值進行歸一化,以使每一列的所有行的總和返回1。此任務觸發浮點精度問題,因為使用double ,總和永遠不會返回1。所以我嘗試了使用BigDecimal但結果略有不同。

這是我的代碼:

    double[][] U = new double[6][1015];
    double[] sumPerCol = new double[db.size()+1];
    for(int i=0; i<U.length; i++){
        for(int j =0; j<U[i].length; j++){
            double x = new Random().nextDouble();
            U[i][j] = x;
            sumPerCol[j] += x;
        }
    }
    double[] sumPerCol2 = new double[db.size()+1];
    for(int i=0; i<U.length; i++){
        for(int j =0; j<U[i].length; j++){
            BigDecimal x = new BigDecimal(U[i][j],MathContext.DECIMAL128);
            BigDecimal tot = new BigDecimal(sumPerCol[j],MathContext.DECIMAL128);
            BigDecimal x2 = x.divide(tot,MathContext.DECIMAL128);
            U[i][j] = x2.floatValue();
            sumPerCol2[j] += U[i][j];
        }
    }
    for(double d : sumPerCol2){
        System.out.println(d);
    }

當然,我沒有正確使用BigDecimal 有人可以幫忙嗎?

沒錯,您不能安全地在雙精度值上使用==。 但是您可能不需要。 歸一化矩陣僅需要將每個元素除以相應列元素的總和。 如果要檢查歸一化,只需對元素求和並檢查與1的差是否“很小”(您可以定義epsilon值,例如10 ^(-10)。

我在這里看不到使用BigDecimal的任何原因。 如果由於某種原因確實需要絕對精度,請使用有理數(分數)的適當實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM