使用BBP公式可以直接求得十六进制π的第n位而不需要计算前n位的数(讲道理,我认为是可以计算十进制的第n位的,毕竟其本身就能直接计算出十进制的π,但我没试),其优点在于可以进行分布式计算,即将一个耗时的运算拆分成若干个运算单元在不同的机器上进行并行运算,提高运算效率。同时也可以用来测试计算机的性能。以下公式将直接求出十进制的π:

其中参数k代表的是所求π的精度,例如:当您希望求出π的前13位的话您只需要将k替换成13即可。其计算出来的结果为3.141592653589793238154767...,得出来也是一个无理数,但只有前13位代表Π。

接下来是如何求得十六进制π的第n位。
首先,您需要知道一个知识点:十进制的小数如何转换为十六进制
例如,小数3.1415926转换为16进制为3.243f69a25b094,为了获取第一个16进制的小数,我们只需要取3.1415926的小数部分0.1415925乘以16即可得到2.2654816,结果的整数位数即为16十六进制小数转换后端结果,再取2.2654816的小数部分0.2654816乘以16即可得到第二个16进制小数位,依次类推,当整数部分位10、11、12等大于9的数时,使用a、b、c等代替即可。

所以,如果需要得到16进制π的第n个数,只需要求得16^n*π即可:

其中

计算时,将式子中的j替换为1、4、5、6然后分别代入上式即可。
式子中的k表示精度,d表示需要计算π的哪一位置

继续得到

这里有两点值得注意:

  1. 式子中的mod符号意为求模,即取16^(d-k)除以(8k+j)得余数,然后再除以(8k+j),这样做的目的是:在计算过程中就去除整数部分(因为我们只需要的是小数部分,整数部分可以直接去除,这在当数据变得非常大时可以极大提高计算效率)。
  2. 将求和部分拆分为两部分[0,d,正无穷]原因和第一点一样,这样的话后面的式子就一定是个小数。所以,真正在计算过程中一定要保证k>d
    然后将计算结果代入第一个式子中即可

最后,还需要注意的点是:代入之后求得的结果需要先去除整数部分然后再乘以16即可得到16进制π的第n位。并且,为了保证第一个式子中求出来的值不为负值,您可能需要在做第一个减法之前加上一个大于4的整数。

下面贴出java代码:
您需要首先在类中添加常量

    private static final BigDecimal ONE = BigDecimal.ONE;private static final BigDecimal TWO = new BigDecimal(2);private static final BigDecimal FOUR = new BigDecimal(4);private static final BigDecimal FIVE = new BigDecimal(5);private static final BigDecimal SIX = new BigDecimal(6);private static final BigDecimal EIGHT = new BigDecimal(8);private static final BigDecimal SIXTEEN = new BigDecimal(16);

以下为方法实现代码,其中calc16dPI即表示计算(16^d)*πcalc16dSj即表示计算(16^d)*Sj,可以看到,我将k(即代码中的ACCURACY)设置为了d+10,这个数是我随便设置的,你也可以将其设置成其他的,具体影响大不大我还没研究。

    BigDecimal calc16dPI(int d) {return FOUR.multiply(calc16dSj(d, 1)).add(BigDecimal.valueOf(3)).subtract(TWO.multiply(calc16dSj(d, 4)).divideAndRemainder(ONE)[1]).subtract(calc16dSj(d, 5).divideAndRemainder(ONE)[1]).subtract(calc16dSj(d, 6).divideAndRemainder(ONE)[1]).divideAndRemainder(ONE)[1];}BigDecimal calc16dSj(int d, int j) {int ACCURACY = d + 10;BigDecimal part1 = BigDecimal.ZERO;BigDecimal part2 = BigDecimal.ZERO;for (int k = 0; k <= d; k++) {part1 = part1.add(SIXTEEN.pow(d - k).divideAndRemainder(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j)))[1].divide(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j)), ACCURACY, BigDecimal.ROUND_HALF_UP));}for (int k = d + 1; k < ACCURACY; k++) {part2 = part2.add(ONE.divide(SIXTEEN.pow(k - d).multiply(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j))), ACCURACY, BigDecimal.ROUND_HALF_UP));}return part1.add(part2);}

以下为测试方法,计算十六进制π的前100位,注意在结果上乘以一个16

    @Testpublic void mainCalc() {for (int d = 0; d < 100; d++) {System.out.println("index of " + (d + 1) + ": " + calc16dPI(d).multiply(SIXTEEN));}}

运行结果截图:

分别得到2、4、3、15、6、10、8、8、8、5...则π的十六进制数应该为3.243f6a8885...(整数位3是我手动加上去的)
参考 我有点酷
参考 维基百科 和 The BBP Algorithm for Pi
如果您有什么需要补充或者我说错的地方欢迎发邮件给我 zouheng613@163.com
bingo

如何使用BBP公式直接计算π的第n位相关推荐

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

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

  2. 身份证号码(最后一位)计算。(使用 Excel 公式,计算 身份证最后一位)

    为什么有的身份证最后一位是X?在强制性国家标准GB11643<公民身份号码>中,对公民身份号码有着明确的规定.    现在使用的身份证号共有18位,每一位都有着明确的意义.按照从左到右的顺 ...

  3. python用bbp公式求圆周率_神奇的BBP公式,可独立计算圆周率任何一位数字,曾震惊数学界!...

    今天,我们来看一个神奇的关于圆周率的公式. 一千多年来,数学家们采用各种办法,来求圆周率的更高精度,比如我国伟大的数学家祖冲之(429-500,字文远),就曾利用复杂的割圆术,将圆周率精确到小数点第七 ...

  4. python用bbp公式计算圆周率_圆周率π现在已经算到多少位了?具体是什么数字?...

    圆周率π现在已经算到多少位了?具体是什么数字? 來源:互聯網  2009-08-12 07:01:36  評論 分類: 人文學科 問題描述: 3.1415926后面是多少? 參考答案: 3.14159 ...

  5. bbp公式求圆周率、python_【并行计算】六种方法计算圆周率

    计算π的历史 圆周率π可能是科学界内外最广为人知的自然常数了.早在公元5世纪时,南朝宋数学家祖冲之用割圆法将圆周率计算到小数点后7位数字.大约同一时间,印度的数学家也将圆周率计算到了小数点后5位.历史 ...

  6. C# BBP公式计算π

    BBP公式可以直接计算出小数点后d位的数,不依赖第d位之前的数字,计算结果为16进制. BBP公式 : 核心公式 π=∑k=0∞{116k(48k−1−28k+4−18k+5−18k+6)}(1)\p ...

  7. python计算圆周率(蒙特卡洛法/模拟法、统计法/穷举法、BBP公式)

    def calculatePI1(): #模拟统计法:蒙特卡罗方法计算圆周率import random as r #导入random模块命名为rimport math as m #导入math模块命名 ...

  8. 中用BBP公式计算_【真课堂】7年级信息技术:数据计算

    教师介绍: 汪小红,一级教师,滨江区科技节scratch项目优秀指导教师,曾获杭州市信息技术优质课二等奖. [教材分析] 数据计算是数据处理过程中的一个重要步骤,数据计算能对数据进行归纳和提炼.学生已 ...

  9. 中用BBP公式计算_如何计算基础代谢率

    了解基础代谢率(BMR)以后,可以知道身体减重.保持重量或增重时需要多少卡路里.基础代谢是身体休息的时候用掉的能量,即便没有动,身体还是在使用能量,维持体温.输送血液.呼吸.消化食物等等.基础代谢可以 ...

最新文章

  1. 扶梯正确使用_乘坐自动扶梯解释CSS浮动
  2. “不会Linux,怎么当程序员?”骨灰级程序员:干啥都不行。
  3. GO!自制一款【不丑】的名片
  4. C#_获取 SQL服务器列表
  5. python dendrogram_【聚类分析】《数学建模算法与应用》第十章 多元分析 第一节 聚类分析 python实现...
  6. window7 MySql Cluster数据库集群配置
  7. js调用ajax案例2,使用ok
  8. 一个进程能够打开最大文件句柄数设到多大才合适(Linux)
  9. docker managed volume - 每天5分钟玩转 Docker 容器技术(40)
  10. matlab fullfile函数
  11. ThinkPHP实现注册功能
  12. gps84转换gcj02公式_WGS84-GCJ-02坐标转化
  13. Android信任Https自签名证书详细教程
  14. lubuntu输入法设置_Ubuntu 设置中文输入法
  15. sa-admin 一个简单又强大的后台管理模板
  16. cm12 系统字体更换
  17. win10添加mysql8环境变量_win10下mysql8.0.12安装及环境变量配置教程
  18. C语言的转义字符,八进制
  19. SAP MM 采购申请列表选择条件说明
  20. antd design mobile +react 动态生成表单

热门文章

  1. mysql添加字段及备注_MySQL字段的说明和备注信息
  2. C语言贪心算法书包问题,贪心算法背包有关问题(帮忙看看看)
  3. CSS中实现菱形图片
  4. 要嫁就嫁个37度男人(转载)
  5. Mixly第三方库开发——OLED库
  6. Thymeleaf是干什么的
  7. 熊猫的python小课_朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!...
  8. 集中隔离第17天2022.3.13
  9. Verilog HDL 语法学习笔记
  10. 领导驾驶舱大数据平台的实施流程