用多边形计算Python中的Pi

用多边形计算Python中的Pi,python,pi,Python,Pi,我在精确计算π时遇到了一个问题。 我用了一种方法,我得到了一个半径为1的圆,在它里面我放置了8,16,32,64的多边形。。。角,每一步后将它们加倍。 但问题是,只有结果的前15位小数是正确的 节目如下: import math import time from decimal import * n_Ecken = 8 while n_Ecken >=8: time.sleep(0.5) n_Ecken = n_Ecken * 2 def berechneAl

我在精确计算π时遇到了一个问题。 我用了一种方法,我得到了一个半径为1的圆,在它里面我放置了8,16,32,64的多边形。。。角,每一步后将它们加倍。 但问题是,只有结果的前15位小数是正确的

节目如下:

import math
import time
from decimal import *

n_Ecken = 8

while n_Ecken >=8:
    time.sleep(0.5)
    n_Ecken = n_Ecken * 2

    def berechneAlpha():
        kreis = 360                                                                 
        alphaInsideFunc = Decimal(kreis) / Decimal(n_Ecken)                         
        return alphaInsideFunc                                                      
    alphaOutsideFunc = berechneAlpha()


    def berechneBeta():                                                             
        betaInsideFunc = Decimal(alphaOutsideFunc) / Decimal(2)                      
        return betaInsideFunc                                                       
    betaOutsideFunc = berechneBeta()                                                


    def berechneKantenlaenge():                                                     
        Gegenkathete = Decimal(math.sin(math.radians(betaOutsideFunc)))             
        KantenlaengeInsideFunc = Gegenkathete * 2                                   
        return KantenlaengeInsideFunc                                               
    KantenlaengeOutsideFunc = berechneKantenlaenge()                                


    def berechneUmfang():                                                           
        UmfangInsideFunc = n_Ecken * KantenlaengeOutsideFunc                        
        return UmfangInsideFunc                                                     
    UmfangOutsideFunc = berechneUmfang()                                            


    def berechnePi():                                                               
        PiInsideFunc = UmfangOutsideFunc / 2                                        
        return PiInsideFunc                                                         

    getcontext().prec = 500
    print Decimal(berechnePi())
    print "Zahl der Ecken:", n_Ecken
我希望你能理解,因为它部分是用德语写的:D 它所做的只是取一个八角形,将360°除以角数(前8个),然后再除以2。22.5°的角度是程序现在放入正弦的结果,以计算八角形范围的1/16,然后再次将结果加倍并乘以多边形的角数。在最后一步(顶部^^^)中,它将多边形中的角数加倍,并再次执行所有这些步骤

以下是前几个步骤的一些结果:

3.121445152258051969340613141
Zahl der Ecken: 16

3.1365484905459393161208936362527310848236083984375
Zahl der Ecken: 32

3.1403311569547529558121823356486856937408447265625
Zahl der Ecken: 64

3.14127725093277287982118650688789784908294677734375
Zahl der Ecken: 128

3.1415138011443008991818715003319084644317626953125
Zahl der Ecken: 256

3.141572940367091337776628279243595898151397705078125
Zahl der Ecken: 512

3.14158772527715957068039642763324081897735595703125
Zahl der Ecken: 1024

3.141591421511199744287523571983911097049713134765625
Zahl der Ecken: 2048

3.1415923455701175726062501780688762664794921875
Zahl der Ecken: 4096

3.14159257658487245379319574567489326000213623046875
Zahl der Ecken: 8192

3.141592634338562728402166612795554101467132568359375
Zahl der Ecken: 16384

3.141592648776985630121316717122681438922882080078125
Zahl der Ecken: 32768

3.14159265238659113350649931817315518856048583984375
Zahl der Ecken: 65536

3.14159265328899284241970235598273575305938720703125
Zahl der Ecken: 131072

3.1415926535145928255587932653725147247314453125
Zahl der Ecken: 262144

3.14159265357099304338817091775126755237579345703125
Zahl der Ecken: 524288

3.141592653585093319890120255877263844013214111328125
Zahl der Ecken: 1048576

3.14159265358861805594870020286180078983306884765625
Zahl der Ecken: 2097152

3.141592653589499573030252577154897153377532958984375
Zahl der Ecken: 4194304

3.141592653589719841278338208212517201900482177734375
Zahl der Ecken: 8388608

3.141592653589774908340359615976922214031219482421875
Zahl der Ecken: 16777216

3.14159265358978867510586496791802346706390380859375
Zahl der Ecken: 33554432

3.141592653589791783730333918356336653232574462890625
Zahl der Ecken: 67108864

3.141592653589792671908753618481568992137908935546875
Zahl der Ecken: 134217728

3.141592653589793115997963468544185161590576171875
Zahl der Ecken: 268435456

3.141592653589793115997963468544185161590576171875
Zahl der Ecken: 536870912
最后两个结果是完全相等和错误的。这是正确的部分:3.141592653589793,其余部分则不是。为什么?

通常,它会重复打印结果的最后一行,最后有许多零,因为我设置了“getcontext().prec=500”

我做错了什么

一般来说,我对Python和编程不是很有经验。 请不要告诉我其他的计算方法,因为它必须是这个(学校)


更新:使用mpmath模块解决了问题。错误在于内置的math.sin()函数在计算这些微小角度时不够精确。只需导入'mpmath'而不是'math'和'decimal'并写入mp.sin()。

您仅对decimal对象使用getcontext,但当您使用传统的数学函数时,会失去精度。只是。

也许,你可以尝试使用符号表达式来获得更精确的近似值。

因为这…115997963468544185161590576171875不等于我在web上的每个页面上发现的值,在Pi中,不能并排出现相同的数字。你所说的“我的估计值的差异随着每一步都在减小”是什么意思?我还认识到,当我使用math.pi打印pi时,说“print Decimal(math.pi)”也不正确。谢谢:)我已经发现了这一点,但还没有尝试过。你对mpmath有什么看法?只是mpmath用于sympy数值计算()。@holofox这个answwer对你很有用?是的,谢谢。我增加了一个关于这个问题的更新部分。程序运行得又快又好。抱歉是第一次在SO:D上