1. 公式准备

计算准确圆周率的马青公式:

对反正切进行级数展开:

就可以得到

π = 16(1/5 - 1/3/5^3 + 1/5/5^5 - ...) - 4(1/239 - 1/3/239^3 + 1/5/239^5 - ...)

π = (16/5 - 4/239) + (- 16/5^3/3 + 4/239^3/3) + (16/5^5/5 - 4/239^5/5) + ...

2. 用 Python 实现

π 的公式已经拿到,我们有一个明确的想要精确的π的位数,那么当式子中n越大的时候,第n项就会越小,小到计算这个精确目标时可以忽略的地步。

注意1:由于程序中浮点数的有效位数有限(小数点后很长的话会被省略,很大的数如果是小数也会用科学技术法),会损失很大精度,所以用整数来计算π。

比如想计算小数点后 7 位,就计算 π * 10^7 是多少,返回 31415926。

比如想计算小数点后 3 位,程序就会给你返回整数 3141,是扩大了 10^3 的结果。

注意2:  想用整数计算 π,那除法的时候就要使用取模运算来保证结果也是整数,以达到保证精度的目的。

注意3: 我用取模操作代替了除法,但是取模对于除法来说本身就是有精度损失的,为了弥补这部分精度,我采取的方案是,先把想精确的位数增加 k,最后把结果减少 k 位。

注意4: 从这句话以后的 n,不再指代上面求 π 的数学公式中的 n,而代表输入的想要精确 π 的位数。

可以预见,注意3中提出的这个方案是有漏洞的,因为 k 是被固定在程序中的,随着用户输入 n 的增大,越来越大量的取模运算损失的精度,必定是固定不变的 k 值所不能弥补的。所以对每一个固定的 k,一定会有一个 n 值,使得本程序所计算的结果是错误的。

对此,我还有一个方案,k 值不固定,由 n 计算得出,n 越大就取越大的 k。但我不想随便定一个 k 与 n 的关系,当然通过代码可以试出一个不错的,但程序计算总有尽头,没有理论支持就无法证明这个关系是真正合理的。

def pi(n):p = 10 ** (n + 10)  # 准备初始整数,先多乘 k 个 0,以增加精度,最后再去掉,这里我取 k=10a = p * 16 // 5     # 第一项的前半部分b = p * 4 // -239   # 第一项的后半部分f = a + b           # 第一项的值p = f               # πj = 3              while abs(f):       # 当|f|=0后计算π的值就不会再改变了a //= -25       # 第n项的前半部分b //= -57121    # 第n项的后半部分f = (a + b) // jp += fj += 2return p // 10**10  # 去掉 k 位,k=10

我还专门写了验证程序来验证取不同 k 时到底 n 为多大计算结果开始不准确。

经过验证,当 k 分别取 1 到 9 时,输入 n 的值为 8, 31, 158, 306, 359, 4254, 13389, 17533, 17533 (对,8和9是一样的)时,计算结果开始出现误差。当 k 取 10 时,n 取 100000 还都没有出现误差。

上面代码计算的十万位

2007年红天蝎圆周率计算分析系统计算的圆周率10万位

查询数字在圆周率中的位置(前10亿位)

【Python、数学】计算任意位数的圆周率π(马青公式)相关推荐

  1. 【Python】计算任意位数的圆周率π(Machin Formula)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.马青公式 二.Python代码实现 1.理清思路 2.C++版本 总结 前言 今天的python课,我给学生介绍m ...

  2. python求圆周率马青公式_Python 实现丘德诺夫斯基(Chudnovsky)法計算高精度圓周率...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 源码:(需要将 @ 替换成 ASCII空格) # -*- coding: UTF-8 -*- # 丘德诺夫斯基法計算高精度圓周率程序 # Calculat ...

  3. python计算圆周率近似值_使用MicroPython计算任意位数圆周率

    计算任意精度的圆周率是个有趣的主题,得益于python的强大计算能力,我们在MicroPython中也可以轻松的计算pi的数值. 先输入下面的代码: """ 文件:pi. ...

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

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

  5. 用马青公式计算圆周率,Python语言

    马青公式: 简单实现 import times_time = time.time() #定义计算的位数 num = 100000 #多计算10位,以防出错 num1 = num + 10 #定义计算小 ...

  6. Python数学计算工具5、Python求最最小公倍数

    最小公倍数百度解析: 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a, ...

  7. python诞生的时间地点人物_用Python来计算任意视频中各人物的出镜时间!这项目值50K吗?...

    用Python来计算任意视频中各人物的出镜时间!这项目值50K吗? 简介当我开始接触深度学习时,学到的第一件事就是图像分类.这个话题非常有趣,包括我在内的很多人都沉浸在它的魅力之中.但是在我处理图像分 ...

  8. 利用马青公式输出π的后任意位数字

    马青公式 π=16arctan15−4arctan1239π=16arctan15−4arctan1239\pi = 16arctan \frac{1}{5} - 4arctan \frac{1}{2 ...

  9. 利用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 ...

最新文章

  1. ubuntu18.04安装CUDA10.0
  2. Matlab神经网络十讲(7): Self-Organizing and LVQ Networks
  3. CodeForces - 1543D1 RPD and Rap Sheet (Easy Version)(异或+交互)
  4. 线段树位运算的三种操作(|,^,)
  5. 通过从全局和类内部重载operator new /delete来获取内存管理权
  6. 3.深度学习练习:Planar data classification with one hidden layer
  7. 延长汽车寿命的6个良好习惯
  8. FileZilla客户端连接腾讯云FTP服务器时出现“227 Entering Passive Mode”
  9. 选择日期保存报错Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String......
  10. zoj 1406 Jungle Roads
  11. Unity中 创建射线的两种方法
  12. java switch的应用
  13. python中一元二次方程的判别式_【Python算法作业】解一元二次方程
  14. wps工资表怎么用计算机,wps制作工资表的方法步骤图
  15. 禁止使用搜狗浏览器打开QQ邮箱,更换成其他邮箱
  16. 分区 MBR文件系统
  17. hark others by kalilinux
  18. 吕海楠201552216
  19. IDE Eval Reset 插件安装使用
  20. Excel数据透视表系列培训--课时2

热门文章

  1. [buuctf] crypto全解——前84道(不建议直接抄flag)
  2. php的字体 怎么变大,网页字体怎么变大
  3. 西游记中孙悟空大闹天宫时天庭各路神将是真的对孙悟空放水吗?
  4. Git 常用的命令之避免尴尬
  5. java json去掉中括号,去掉json中的中括号
  6. 与苹果相反 三星向所有第三方应用开放指纹识别功能
  7. 盛银消费金融:年报亮眼背后,资产规模或限制持续增长
  8. shell-批量裁剪各个尺寸的图教程一(ImageMagick安装配置)
  9. CSP 201609-3 炉石传说(C++)
  10. uboot中 使用i2c