国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

windows - Java高精度運(yùn)算問(wèn)題求助
typecho
typecho 2017-06-28 09:22:10
[Java討論組]

公司項(xiàng)目里面需要做大量的高精度運(yùn)算,剛開始用double類型運(yùn)算,后來(lái)發(fā)現(xiàn)用double類型運(yùn)算后有些值的精確度超過(guò)了理想范圍,就用了BigDecimal來(lái)計(jì)算,現(xiàn)在的問(wèn)題是BigDecimal的運(yùn)算效率比double慢幾十倍,數(shù)據(jù)量大的話,慢的要死。請(qǐng)問(wèn)有沒有好的解決方案?這個(gè)問(wèn)題急需解決。

//相關(guān)性系數(shù)計(jì)算
public BigDecimal getRelativityTool_bydim(RelativityTool u) {
        BigDecimal sim = new BigDecimal("0"); //最后的皮爾遜相關(guān)度系數(shù)

        BigDecimal common_items_len = new BigDecimal(this.rating_map_list.size()); //操作數(shù)的個(gè)數(shù)

        BigDecimal this_sum = new BigDecimal("0"); //第一個(gè)相關(guān)數(shù)的和

        BigDecimal u_sum = new BigDecimal("0"); //第二個(gè)相關(guān)數(shù)的和

        BigDecimal this_sum_sq = new BigDecimal("0"); //第一個(gè)相關(guān)數(shù)的平方和

        BigDecimal u_sum_sq = new BigDecimal("0"); //第二個(gè)相關(guān)數(shù)的平方和

        BigDecimal p_sum = new BigDecimal("0"); //兩個(gè)相關(guān)數(shù)乘積的和

        for (int i = 0; i < this.rating_map_list.size(); i++) {
            BigDecimal this_grade = this.rating_map_list.get(i);
            BigDecimal u_grade = u.rating_map_list.get(i);
            //評(píng)分求和                     //平方和                     //乘積和

            this_sum = this_sum.add(this_grade);
            u_sum = u_sum.add(u_grade);
            this_sum_sq = this_sum_sq.add(this_grade.pow(2));
            u_sum_sq = u_sum_sq.add(u_grade.pow(2));
            p_sum = p_sum.add(this_grade.multiply(u_grade));
        }
        BigDecimal num = common_items_len.multiply(p_sum).subtract(this_sum.multiply(u_sum));
        BigDecimal den = sqrt(common_items_len.multiply(this_sum_sq).subtract(this_sum.pow(2)).multiply(common_items_len.multiply(u_sum_sq).subtract(u_sum.pow(2))));
        if (den.compareTo(new BigDecimal("0")) == 0) {
            sim = new BigDecimal("1");
        } else {
            sim = num.pide(den,5, BigDecimal.ROUND_HALF_UP);
        }
        return sim;
    }
    //大數(shù)字開方
    public static BigDecimal sqrt(BigDecimal x) {
        BigDecimal n1 = BigDecimal.ONE;
        BigDecimal ans = BigDecimal.ZERO;
        while ((n1.multiply(n1).subtract(x)).abs().compareTo(BigDecimal.valueOf(0.001)) == 1) {
            BigDecimal s1 = x.pide(n1, 2000, BigDecimal.ROUND_HALF_UP);
            BigDecimal s2 = n1.add(s1);
            n1 = s2.pide(BigDecimal.valueOf(2), 2000, BigDecimal.ROUND_HALF_UP);

        }
        ans = n1;
        BigDecimal rt = new BigDecimal(ans.toString().split("\\.")[0]);
        return rt;
    }
typecho
typecho

Following the voice in heart.

全部回復(fù)(3)
怪我咯

除了使用C或者C++來(lái)做高精度運(yùn)算之外,好像沒有什么辦法可以同時(shí)兼顧性能和精度了。

扔個(gè)三星炸死你

大學(xué)計(jì)算機(jī)專業(yè)有門課程叫“計(jì)算方法”,專門探討如何在精度有限的計(jì)算過(guò)程中保持誤差最小化。樓主有興趣的話可以找下相關(guān)教材。

歐陽(yáng)克

后來(lái)發(fā)現(xiàn)用double類型運(yùn)算后有些值的精確度超過(guò)了理想范圍
是超過(guò)還是滿足不了?

這里有一段計(jì)算平方根的代碼,我從stackoverflow上找到的,在我自己的機(jī)子測(cè)試要比你上面那個(gè)快十倍左右。
所以: 一則你可以通過(guò)改進(jìn)的算法來(lái)提高性能,其二,最好的辦法找一些已有的library來(lái)直接用:例如這個(gè)上面列的

public void test_sqrt() {
    BigDecimal x = BigDecimal.valueOf(Long.MAX_VALUE);
    BigDecimal x0 = BigDecimal.ZERO;
    BigDecimal x2 = new BigDecimal(2);
    BigDecimal x1 = new BigDecimal(Math.sqrt(x.doubleValue()));
    while (!x0.equals(x1)) {
        x0 = x1;
        x1 = x.pide(x0, 2000, BigDecimal.ROUND_HALF_UP);
        x1 = x1.add(x0);
        x1 = x1.pide(x2, 2000, BigDecimal.ROUND_HALF_UP);
    }
    assertEquals(3037000499L, x1.longValue());
}
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)