算法1:拉马努金算法

公式如下:

不采用阶乘的版本是因为pochhammer符号的运算量要小于阶乘,一次循环只需要计算一次即可,而4n的阶乘一次循环需要计算4次

代码如下:

public static BigDecimal ramanujanBigDecimalFamous(int times, int precision){MathContext mc = new MathContext(precision, RoundingMode.HALF_EVEN);BigDecimal result = ZERO;BigDecimal k = toBigDecimal(99);BigDecimal power = ONE;BigDecimal coefficient1 = toBigDecimal(26390);BigDecimal coefficient2 = toBigDecimal(1103);BigDecimal coefficientBinom = ONE;BigDecimal pi;long start = System.currentTimeMillis();for (int i = 0; i < times; i++) {BigDecimal bigDecimalI = toBigDecimal(i);if (i > 0){BigDecimal bigDecimal2I = bigDecimalI.multiply(TWO);BigDecimal bigDecimal4I = bigDecimalI.multiply(FOUR);coefficientBinom = coefficientBinom.multiply(bigDecimal2I.add(ONE.negate()).divide(bigDecimal2I, mc).multiply(bigDecimal4I.add(THREE.negate()).divide(bigDecimal4I, mc), mc).multiply(bigDecimal4I.add(ONE.negate()).divide(bigDecimal4I, mc), mc), mc);power = power.multiply(k.pow(4));}result = result.add(coefficientBinom.multiply(coefficient1.multiply(bigDecimalI).add(coefficient2).divide(power, mc), mc), mc);}pi = k.pow(2).divide(EIGHT.sqrt(mc).multiply(result, mc), mc);long take = System.currentTimeMillis() - start;System.out.println(take);return pi;}

已在外部定义ONE、TWO那些常量就是数字对应的BigDecimal对象,toBigDecimal方法就是产生对应数字的BigDecimal对象,注意,涉及小数的高精度运算需要定义精度(MathContext)对象,否则有可能会出问题

计算100000位圆周率耗时:2983422ms约为50分钟

算法2:楚德诺夫斯基算法

公式如下:

代码如下:

public static BigDecimal chudnovskyBigDecimalFamous(int times, int precision){MathContext mc = new MathContext(precision, RoundingMode.HALF_EVEN);BigDecimal result = ZERO;BigDecimal k = toBigDecimal(53360);BigDecimal power = k;BigDecimal coefficient1 = toBigDecimal(545140134);BigDecimal coefficient2 = toBigDecimal(13591409);BigDecimal coefficientBinom = ONE;BigDecimal pi;BigDecimal sgn = ONE;long start = System.currentTimeMillis();for (int i = 0; i < times; i++) {BigDecimal bigDecimalI = toBigDecimal(i);if (i > 0){BigDecimal bigDecimal2I = bigDecimalI.multiply(TWO);BigDecimal bigDecimal6I = bigDecimalI.multiply(SIX);coefficientBinom = coefficientBinom.multiply(bigDecimal2I.add(ONE.negate()).divide(bigDecimal2I, mc).multiply(bigDecimal6I.add(FIVE.negate()).divide(bigDecimal6I, mc), mc).multiply(bigDecimal6I.add(ONE.negate()).divide(bigDecimal6I, mc), mc), mc);power = power.multiply(k.pow(3));}result = result.add(coefficientBinom.multiply(coefficient1.multiply(bigDecimalI).add(coefficient2).divide(power, mc), mc).multiply(sgn), mc);sgn = sgn.negate();}pi = EIGHT.multiply(toBigDecimal(10005).sqrt(mc), mc).divide(result, mc);long take = System.currentTimeMillis() - start;System.out.println(take);return pi;}

计算10000位圆周率耗时:1713123ms约为28分半

可以看出楚德诺夫斯基公式计算圆周率的效率要比拉马努金公式高上不少,这也是现在破纪录的主流算法都是采用该算法的原因,在此膜拜一下楚德诺夫斯基兄弟

本人对该方面了解不深,若有优化空间,欢迎在评论区提出,谢谢大家

利用Java的BigDecimal计算高精度圆周率相关推荐

  1. java 两日期的周数_利用 Java 中 Calendar 计算两个日期之间的天数和周数

    利用 Java 中 Calendar 计算两个日期之间的天数和周数 前言 究竟什么是一个 Calendar 呢? 中文的翻译就是日历, 那我们立刻可以想到我们生活中有阳 (公) 历阴 (农) 历之分它 ...

  2. 利用Java的BigDecimal与马青公式精确计算π后10000位,

    首先给出公式如下: π=16arctan1/5−4arctan1/239: 即是 π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)-)−4×(1/(1×239)−1/(3×2 ...

  3. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  4. java日期相差周_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  5. Java算法:计算π(圆周率)

    3世纪中期,魏晋时期的数学家刘徽首创割圆术 利用对圆形的无线分割,使计算结果更接近π 方法1(double低精度) 在圆形中做一个正六边形,此六边形的每个定点都在圆上.正六边形中心和圆心重合.正六边形 ...

  6. python用bbp公式计算圆周率_利用BBP公式来计算Pi圆周率的PHP代码

    <?php /** * 圆周率计算(BBP) * @author Moyo * @url http://moyo.uuland.org/code/php-pi-calc/ * @version ...

  7. java使用BigDecimal 处理商业精度及高精度详解

    前言 之前我是写过一篇类似笔记: java处理高精度的商业计算 但是呢,写的太简单,关键还没有写到要点,所以重新写一篇. 情形 由于公司最近要求把股票相关的数据,全部交给后端来处理,不再由前端来处理. ...

  8. java.math.BigDecimal的用法-商业计算

    如果我们编译运行下面这个程序会看到什么? public class test{      public static void main(String [] args){          Syste ...

  9. Python利用马青公式计算圆周率Π并写入文件

    一.什么是马青公式         马青公式由英国天文学教授约翰·马青(John Machin ,1686 –1751)于1706年发现,他利用这个公式计算到了100位的圆周率. 马青公式每计算一项可 ...

最新文章

  1. R语言distCosine函数计算大圆距离实战(Law of Cosines Great Circle Distance)
  2. Flex Socket 跨域问题的解决办法
  3. [通告]Nuget服务宕机,出现 503 Server Unavailable 错误无法编译及解决方法
  4. Error:org.gradle.api.internal.changedetection.state.FileCollectionSnapshotImpl cannot be cast to org
  5. Java wait forever_彻底搞清楚Java并发 (一) 基础
  6. 均值归一化_超越BN和GN!谷歌提出新的归一化层:FRN
  7. java获取用户地理位置_java web 通过ip获取当前地理位置
  8. Ollydbg使用教程学习总结(二)
  9. ASP.NET部署与安装_MSI制作图文教程.
  10. spring-注解实现入门
  11. java 浏览器信息吗_java获取浏览器信息
  12. 安卓添加滚轮代码_[按键精灵手机版教程]安卓实战——制作天天酷跑脚本(2)...
  13. linux更换域名全站301,linux服务器wdcp面板做301域名重定向设置
  14. 使用Qtip2来开发功能强大的删除和信息提示功能
  15. bzoj3159: 决战
  16. C语言中学生成绩管理系统
  17. mybatisplus代码生成器
  18. 金融安全视角农民投资理财的实证研究——以X县为例
  19. 高效能人士的7个习惯
  20. uniApp H5微信网页授权,微信支付

热门文章

  1. 前端 js处理table数据转化为导出Excel文件
  2. c语言中12.是什么意思,C语言中DWORD-12是什么意思
  3. Unity 布料模拟插件Magica Cloth
  4. Android编写电话拨号器
  5. 菲戈挑战足球守门员机器人原理
  6. PreferenceManager.getDefaultSharedPreferences(SettingsActivity.this);
  7. 关于表关联数据几种展示方法
  8. 金志文机器人歌叫什么_乐视《蒙面唱将猜猜猜》机器人九号是好声音金志文?...
  9. 草地天空全套26张英文字母
  10. 广州证券携手8Manage 实现数字化管理体验