当前位置 博文首页 > 利用Python计算圆周率π的实例代码

    利用Python计算圆周率π的实例代码

    作者:明月十四桥 时间:2021-05-29 17:45

    前言

    A货:什么!你不会背圆周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 

    桥哥:我会算呀 !!!

    一、圆周率的历史

    1、中国

    ★ 魏晋时期,刘徽曾用使正多边形的边数逐渐增加去逼近圆周的方法 (即「割圆术」),求得π的近似值3.1416。

    ★ 汉朝时,张衡得出π的平方除以16等于5/8,即π等于10的开方(约为3.162)。虽然这个值不太准确,但它简单易理解,所以也在亚洲风行了一阵。

    ★ 王蕃(229-267)发现了另一个圆周率值,这就是3.156, 但没有人知道他是如何求出来的(ps. 没开源呗!)。

    ★ 公元5世纪,祖冲之和他的儿子以正24576边形,求出圆周率约为355/113,和真正的值相比,误差小于八亿分之一。这个纪录在一千年后才给打破。(ps. 在大部分人不知股股定理年代,真牛!)

    2、印度

    ★ 约在公元530年,数学大师阿耶波多利用384边形的周长,算出圆周率约为√9.8684。

    ★ 婆罗门笈多采用另一套方法,推论出圆周率等于10的平方根。(ps. 跟张衡大佬的结果一致,但过程不同)

    3、欧洲

    ★ 斐波那契算出圆周率约为3.1418。

    ★ 韦达用阿基米德的方法,算出3.1415926535<π<3.1415926537。他是第一个以无限乘积叙述圆周率的人。

    ★ 鲁道夫万科伦以边数多过32000000000的多边形算出有35个小数位的圆周率。

    ★ 华理斯在1655年求出一道公式π/2=2×2×4×4×6×6×8×8...../3×3×5×5×7×7×9×9......

    ★ 欧拉发现的e的iπ次方加1等于0,成为证明π是超越数的重要依据。

    二、用python计算圆周率π

    【方法】蒙特卡洛法

    【程序设计思路】使用python random库随机生成点,落在正方形内,计算正方形内的圆内落点与正方形内落点之比,近似为面积之比,随机数越随机,数量越大越准确。

    【软件环境】python 3.6(本程序可兼容python 2.x)

    【代码】

    from random import random
    from time import perf_counter
     
    def calPI(N = 100):
        hits = 0
        start = perf_counter()
        for i in range(1, N*N+1):
            x, y = random(), random()
            dist = pow(x ** 2 + y ** 2, 0.5)
            if dist <= 1.0:
                hits += 1
        pi = (hits * 4) / (N * N)
        use_time = perf_counter() - start
        return pi, use_time
     
    PI, use_time = calPI(10000)
    print('use Monte Carlo method to calculate PI: {}'.format(PI))
    print('use time: {} s'.format(use_time))

    【结果展示】

    震惊:10000次随机数,精确到3.1415了,把桥哥放在1000年前,可不得了

    附:python输出指定精度的圆周率pi的值

    首先像所有人都会的一样,本能地敲出

    import math
    val = math.pi
    print(val)
    

    这样就得到了pi的近似值3.141592653589793,要得到后面的小数,

    不是直接可以简单粗暴的乘以10的指数

    import math
    val = math.pi * 100000000000000000
    print(val)
    

    但是当val的小数部分都变成整数141592653589793的时候,并不会如我们所想的那样露出后几位整数,而是直接变成科学计数法3.141592653589793e+24,所以在小数点移位之后为了看到整数部分,我们必须把float转换成int

    import math
    
    def get_pi_value(x):
      if(x>0):
       num = math.pow(10,x)
       val = int(math.pi * num)
       print(val)
      else:
       print('输入有误')
       
    for i in range(10):
     get_pi_value(i * 10)
    
    

    运行结果:

    输入有误
    31415926535
    314159265358979334144
    3141592653589793216413703340032
    31415926535897931797658451191693855162368
    314159265358979323748068948991981337089580185157632
    3141592653589793042280431964658831312838665295201939643957248
    31415926535897934343019391492015828684494553443559665723073458675384320
    314159265358979299628295535813807516164434328768456060679773689288809487458631680
    3141592653589793231804887682686061504016619085797532053907788745336000826072569315489480704

    总结

    js
    下一篇:没有了