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

2023-11-05

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

其中参数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*π即可:
π的第n位
其中
π的第n位

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

继续得到
计算π得第n位

这里有两点值得注意:

  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

    @Test
    public 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • js实现数学的排列组合

    js实现数学的排列组合 实现 组合 param arr 待选数组 param size 从数组里面要抽几个元素进行组合 function combination arr size 1 45 3 9 4 14 1 const r param
  • 差分与微分

    差分与微分 差分和微分都是数学中的一些基本概念 它们在数学 物理学 经济学和其他领域中都有广泛的应用 1 差分 差分可以理解为函数值之间的差别 特别地 如果一个函数 f f f 在两个相邻点 x 0
  • EM算法估计beta混合模型参数

    1 用 network memerisation 造成的 clean noisy 数据 loss 差异来区分 clean noisy data 当得到一批数据的 normalised loss l i 0
  • 最大熵算法及简单例子

    最近在学模式识别 正在看Introduction to Pattern Recognition这本书 挺不错的一本书 好 下面和大家一起来学习最大熵算法 首先 最大熵算法是干什么的呢 一般是用来估计一个分布 至于把分布估计出来之后用来干什么
  • 数学的幽默打油诗

    1 常微分学常没分 数理方程没天理 实变函数学十遍 泛函分析心犯寒 微分拓扑躲不脱 随机过程随机过 微机原理闹危机 汇编语言不会编 量子力学量力学 机械制图机械制 2 高数 拉格朗日 傅立叶旁 我凝视你凹函数般的脸庞 微分了忧伤 积分了希望
  • Taylor公式和插值多项式

    Taylor公式和插值多项式 笔记总结自 复旦大学 陈纪修 数学分析 课程 第5章第3节 Taylor公式和插值多项式 文章目录 Taylor公式和插值多项式 一 Taylor公式 带Peano余项的Taylor公式 带Lagrange余项
  • 双重求和∑∑的定义及性质

    目录 一 复习求和符号 二 二重求和的定义 三 双重求和 交换求和顺序 一 复习求和符号 自从约瑟夫 傅立叶于1820年引入求和符号 大写的希腊字母sigma 以来 求和 以及双重求和 在数学公式推导 命题证明中被经常使用 掌握它的定义和性
  • 线性代数的几何意义(一)——线性代数的意义

    线性代数的几何意义 一 一 线性 代数 的意义 何为 代数 代数 一词的英文是Algebra 源于阿拉伯语 其本意是 结合在一起 就是说代数的功能就是把许多看似不相关的事物 结合在一起 也就是进行抽象 抽象的目的不是故弄玄虚 而是为了更好的
  • 牛顿迭代法原理讲解

    牛顿迭代法原理讲解 牛顿迭代法是用于求解等式方程的一种方法 类似于求解F x 0的根 牛顿迭代法求解的是近似根 这个想法准确来说来源于泰勒展开式 我们知道 有些时候 我们需要求解的表达式可能非常复杂 通过一般的方法 我们很难求出它的解 所以
  • 生态系统过程模型

    生态系统过程模型 根据生态系统的生理生态学特性 结合影响生态系统过程的观测指标 提出的能够反映生态系统过程的机制模型 统计模型 stochasticmodel statisticmodel probabilitymodel 指以概率论为基础
  • 矩阵 矩阵的基本运算规则 行列式 逆矩阵

    矩阵 本质 矩阵是个数表 从线性变换的视角看 矩阵是记录线性变换这一过程的描述信息 记为 A m n A m times n Am n 或 A a i j A a ij A aij 或 A a i j m n A a ij m times
  • 概率-什么是一阶矩,二阶矩?

    根据S M 罗斯的概率论教程 一阶矩指E X 即数列X的均值称为一阶矩 以此类推 E Xn n 1 称为X的 n阶矩 也就是二阶矩 三阶矩 参考 1 图灵数学 统计学丛书08 概率论基础教程 第7版 美S M 罗斯 郑忠国 译 人民邮电出版
  • Dijkstra与Bellman-Ford算法对比

    文章目录 TOC Dijkstra Dijkstra 伪代码 Dijkstra 为什么不能有负权重 Dijkstra算法复杂度 Bellman Ford算法 Bellman Ford算法伪代码 Bellman Ford判断是否有负权 Bel
  • LaTeX 数学公式大全!

    LaTeX 数学公式大全 这里是来自一篇教程的截图 很全面
  • 正定Hermiltian矩阵分解的两种方法

    对于正定Hermiltian矩阵 B B B 想要求解 D D D 使其满足
  • 蓝以中老师《高等代数》第01章:代数学的经典课题,笔记

    蓝以中老师 高等代数 第01章 代数学的经典课题 笔记 如下
  • 矩阵求导常用公式

    矩阵求导常用公式 1 引言 2 向量的导数 2 1 向量对标量求导 Vector by scalar 2 2 标量对向量求导 Scalar by vector 2 3 向量对向量求导 Vector by vector 3 矩阵的导数 3 1
  • 美国大学生数学建模竞赛赛题特点

    美国大学生数学建模竞赛赛题特点 赛题灵活度高 内容广泛 反恐 防灾 环境 健康医疗 交通 新能源等等 开放性大 评价类问题多且复杂 离散型优化问题多 除A题 如 2016B太空碎片的处理 2018D电动车充电桩的优化 2019D卢浮宫疏散路
  • 【华为OD机试真题 python】数字加减游戏【2022 Q4

    题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 在每个回合中 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用
  • 完美数

    按照毕达哥拉斯的说法 数的完满取决于它的真因数 即除了自身以外的约数 例如 12的因数是 1 2 3 4 和 6 当一个数的各因数之和大于该数本身时 该数称为 盈 数 于是 12 是一个盈数 因为它的因数加起来等于 16 另一方面 当一个数

随机推荐

  • 断点续传-vue

    实现断点续传主题思路 对文件进行每200MB切片 基于spark md5计算出第一个切片文件的hash值 将文件的名称 大小 hash值传给后台 后台确认当前文件是否上传过 已上传过返回之前上传大小或第几个切片 前端再次上传切片 直到上传完
  • docker bi工具superset汉化

    很简单 修改一下superset config py 文件就可以了 但是 找文档花了三天时间 vim opt superset docker pythonpath dev superset config py 文件中添加如下内容即可 LAN
  • 在Visual Sutdio 2017中使用boost库

    对C 有一定了解的同学一定听说过boost库 这是C 的一个著名类库 在C 的地位感觉可以和Spring在Java中相比 boost向来有准标准库之称 很多新特性例如智能指针等都是先在boost中实现 后来被吸收到标准库之中 而且boost
  • WDS1期第12课 字符设备驱动 7 async异步通知用户空间 驱动代码的kill_fasync函数通知用户的signal函数 fcntl

    前面的query interrupt poll都需要用户程序去主动去读或查询 async异步通知 可以由驱动程序主动去通知用户程序中断的到来 信号也可以通知TASK INTERRUPTIBLE的进程 SIGKILL可以杀掉任何进程 就是传说
  • javascript之数据遍历

    JavaScript之数据遍历 for循环 var a 沐水莲心 22 男 for var i 0 i
  • WIFI 信道 channel

    5GHz 信道划分 国内室内AP可用36 40 44 48 52 56 60 64 149 153 157 161 165等13个信道 2 4GHz 共有14个信道 国内可用1 13信道 不干扰的仅1 6 11
  • Linux多线程

    全文目录 线程概念 线程缺点 线程的如何看待进程内部的资源 进程vs线程 线程控制 pthread库 pthread t 线程创建 线程等待 线程分离 线程退出 总结 线程互斥 互斥量接口 互斥量实现原理 总结 线程安全与可重入 常见的线程
  • CMake应用:基础篇

    CMake是一个开源 跨平台的编译 测试和打包工具 它使用比较简单的语言描述编译 安装的过程 输出Makefile或者project文件 再去执行构建 在使用IDE开发软件的过程中 代码的编译和构建一般是使用IDE自带的编译工具和环境进行编
  • 什么是面向接口编程、面向过程编程、面向对象编程?

    1 什么是面向接口编程 IOP 面向接口编程 Interface Oriented Programming IOP 是一种编程思想 接口作为实体抽象出来的一种表现形式 用于抽离内部实现进行外部沟通 最终实现内部变动而不影响外部与其他实现交互
  • (毕业设计资料)基于STM32智能窗帘控制系统设计

    096 电路方案 基于STM32智能窗帘控制系统设计 基于STM32单片机的智能窗帘控制系统 该系统集蓝牙遥控 人声识别控制 空调红外遥控 24c02数据储存 433m遥控 热释电红外感应 温湿度检测以及光控为一体 并可根据需求设置窗帘开合
  • Java中的内存泄漏例子以及对应解决方案

    转自How Memory Leaks Happen in a Java Application 英语好的可以去原网站瞅瞅 1 什么是Java中的内存泄漏 内存泄漏的标准定义是当应用程序不再使用对象 但垃圾回收器无法将它们从工作内存中删除时发
  • 【上拉下拉功能】GPIO的上拉下拉功能说明

    GPIO的上拉下拉功能说明 2011 07 11 14 36 394人阅读 评论 0 收藏 举报 The port pull up register controls the pull up resister enable disable
  • 华为校招机试题-查找单入口空闲区域-2023年

    题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲 请找到最大的单入口空闲区域 解释 空闲区域是由连通的 O 组成的区域 位于边界的 O 可以构成入口 单入口空闲区域即有且只有一个位
  • 【华为OD机试】返回矩阵中非1的元素个数(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • UID卡、CUID卡、FUID卡的区别

    UID卡 国外称GEN1 所有区块可被重复读写 卡片ID可改且使用后门指令更改ID ID可被重复修改 响应后门指令 意味着可被使用后门指令检测是否为克隆卡的机器发现 CUID卡 国外称GEN2 所有区块可被重复读写 卡片ID可改且使用普通写
  • stm32 串口发送和接收

    串口发送 include stm32f10x h Device header include
  • HTML+CSS 旋转照片墙!源代码(简易动画干货快收藏!!)

    拿走请三连 并注明出处 新手上路 路过的大佬请多多指教 动画特效为11张照片 环绕着旋转 照片可自改添加 源代码中用到的照片未上传
  • 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221

    root ubuntu etc fdfs usr bin fdfs upload file etc fdfs client conf etc a jpg 2019 12 03 11 38 14 ERROR file connection p
  • MySQL学习(十七):数据类型之文本字符串类型

    文本字符串类型 类型 值的长度 长度范围 占用的存储空间 CHAR M M 0 lt M lt 255 M个字节 VARCHAR M M 0 lt M lt 65535 实际长度 1个字节 TINYTEXT L 0 lt L lt 255
  • 如何使用BBP公式直接计算π的第n位

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