午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

windows - Java高精度運(yùn)算問(wèn)題求助

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

問(wèn)題描述

公司項(xiàng)目里面需要做大量的高精度運(yùn)算,剛開(kāi)始用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)有沒(méi)有好的解決方案?這個(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ù)字開(kāi)方 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; }

問(wèn)題解答

回答1:

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

回答2:

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

回答3:

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

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 一二三区在线 | 久久久久国产 | 黄色a一级片 | 久久青青热 | 中文字幕一区二区三区视频 | 五月天色婷婷丁香 | 国产h视频 | 中国女人一级一次看片 | 欧美精品99 | 国产三级理论 | 亚洲伦理久久 | 日本少妇激情 | 黄色免费毛片 | 欧美一区二区公司 | 在线观看国产精品视频 | 天天爽天天爽 | 毛片xxx| 亚洲国产精| 国产精品v亚洲精品v日韩精品 | 午夜肉体高潮免费毛片 | 国产视频一区二区三区在线观看 | 成人在线视频网站 | 香蕉视频免费在线观看 | 91九色国产视频 | 青青草激情视频 | 亚洲综合天堂 | 国产亚洲精 | 日韩国产在线播放 | 亚洲+小说+欧美+激情+另类 | 激情网五月天 | 亚洲精品美女 | 深夜福利久久 | 69福利视频 | 青草久久久 | 久久综合五月 | 欧美成人午夜精品免费 | 亚洲图片在线视频 | 粉嫩视频在线观看 | 欧美老女人bb | 免费看成人 | 六月婷婷激情 |