国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

windows - Java高精度運算問題求助

瀏覽:110日期:2023-10-25 11:34:42

問題描述

公司項目里面需要做大量的高精度運算,剛開始用double類型運算,后來發現用double類型運算后有些值的精確度超過了理想范圍,就用了BigDecimal來計算,現在的問題是BigDecimal的運算效率比double慢幾十倍,數據量大的話,慢的要死。請問有沒有好的解決方案?這個問題急需解決。

//相關性系數計算public BigDecimal getRelativityTool_bydim(RelativityTool u) {BigDecimal sim = new BigDecimal('0'); //最后的皮爾遜相關度系數BigDecimal common_items_len = new BigDecimal(this.rating_map_list.size()); //操作數的個數BigDecimal this_sum = new BigDecimal('0'); //第一個相關數的和BigDecimal u_sum = new BigDecimal('0'); //第二個相關數的和BigDecimal this_sum_sq = new BigDecimal('0'); //第一個相關數的平方和BigDecimal u_sum_sq = new BigDecimal('0'); //第二個相關數的平方和BigDecimal p_sum = new BigDecimal('0'); //兩個相關數乘積的和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); //評分求和 //平方和 //乘積和 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; } //大數字開方 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; }

問題解答

回答1:

除了使用C或者C++來做高精度運算之外,好像沒有什么辦法可以同時兼顧性能和精度了。

回答2:

大學計算機專業有門課程叫“計算方法”,專門探討如何在精度有限的計算過程中保持誤差最小化。樓主有興趣的話可以找下相關教材。

回答3:

后來發現用double類型運算后有些值的精確度超過了理想范圍是超過還是滿足不了?

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

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());}

標簽: java
相關文章:
主站蜘蛛池模板: 欧美国产成人一区二区三区 | 精品久久久久久久久久久久久久久 | 国产一区二区精品久久凹凸 | 亚洲国产成人久久精品图片 | 毛片免费全部免费观看 | 成人亚洲国产综合精品91 | 九九在线精品视频播放 | 欧美日韩国产58香蕉在线视频 | 国产欧美一区二区三区在线看 | 交videos人妖| 在线观看精品自拍视频 | 长腿美女被啪的欲仙欲死视频 | 国产亚洲国产bv网站在线 | 久久久久一区二区三区 | 三级国产在线 | 国产成人精品一区二三区在线观看 | 久久久亚洲精品蜜桃臀 | 国产精品拍拍拍福利在线观看 | 99久久伊人一区二区yy5099 | 日韩免费一级毛片 | 色狠狠色综合吹潮 | 欧美成人精品大片免费流量 | 91高端极品外围在线观看 | 日本视频免费在线播放 | 久久婷婷影院 | 亚洲高清免费观看 | 一区二区三区四区国产精品 | 国产一区二区三区免费在线视频 | 国产精品密蕾丝视频 | 国产精品久久久久久久 | 九九在线偷拍视频在线播放 | 毛片基地免费视频a | 三级网址在线观看 | 精品久久久久久久九九九精品 | 99久久99久久精品免费看子 | 亚洲精品日本 | 黄 色 成 年 人小说 | 亚洲视频男人的天堂 | 在线免费观看毛片网站 | 久草观看 | 全部在线美女网站免费观看 |