为了账号安全,请及时绑定邮箱和手机立即绑定

[原创]04-圆周率的计算

标签:
Premiere

抛砖引玉三种方法

1.传说中计算π的超牛的c程序3行代码计算π后面800位)1:传说中计算π的超牛的C程序,3行代码,计算π后面2800位...

原c代码如下:

#include "stdio.h"long a=10000, b, c=2800, d, e, f[2801], g;void main() {for( ;b-c; ) f[b++] =a/5;for( ; d=0, g=c*2; c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c; d+=f[b]*a,f[b] =d%--g,d/=g--,--b; d*=b) ;
}

表示根本不理解背后的数学推理,后续再继续研读吧。
根据c代码,换成python代码,效率和准确度都很高,如下:

import numpy as np


c = 2800f = np.zeros(2801)
b = 0for i in range(c):  # 除最后一位,其余全部是2
    f[i] = 2e = 0while c > 0:
    d = 0
    b = c    while b > 0:
        d *= b
        d += (f[b] * 10)
        f[b] = d % (b * 2-1)
        d = int(d/(b * 2 - 1))  # 如果不取整,源代码结果不对
        b -= 1
    c -= 1
    print("%d" % ((e+int(d)/10) % 10), end="")
    e = d % 10

2.割圆术

我们伟大祖先智慧的结晶,他们都是徒手算,徒手开根号...Orz!
上原理图:


webp

割圆术原理


当计算到6*2^15正多边形以后,结果不是很准确。

i = 0n = 15an = 1while i < n:
    an1Pow = 2 - math.sqrt(4-math.pow(an, 2))
    an1 = math.sqrt(an1Pow)
    an = an1
    i += 1print("由正%d边形求出的PI为%.50f" % (6*math.pow(2, n), (3*math.pow(2, n)*an)))

3.莱布尼兹公式

webp

莱布尼兹公式


公式推导超出了本文讨论的范围...感兴趣的可以随意去证明

# 为了节省空间,定义xrange函数,py3中没有该函数def xrange(x):
    n = 1
    while n <= x:        yield n
        n += 2quarterPi = 0flag = 1for i in xrange(100000000):
    quarterPi += (1/i)*flag
    flag = -flag
print(4*quarterPi)

类似的还有e这样的神奇数字,数学神奇,编程也很神奇。跟随Crossin编程教室一直在学习,继续努力吧。



作者:Damon0626
链接:https://www.jianshu.com/p/f11bd1069a09


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消