美文网首页我爱编程python自学
[原创]04-圆周率的计算

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

作者: Damon0626 | 来源:发表于2018-10-27 17:37 被阅读6次

    抛砖引玉三种方法

    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 = 2800
    f = np.zeros(2801)
    b = 0
    for i in range(c):  # 除最后一位,其余全部是2
        f[i] = 2
    e = 0
    while 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!
    上原理图:


    割圆术原理

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

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

    3.莱布尼兹公式

    莱布尼兹公式

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

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

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

    相关文章

      网友评论

        本文标题:[原创]04-圆周率的计算

        本文链接:https://www.haomeiwen.com/subject/dqbdtqtx.html