我在准确计算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 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°除以前(然后是2)然后再加上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
最后2个结果完全相同和错误。这是正确的部分:3.141592653589793,其余部分不是。为什么?
通常它会重复打印结果的最后一行,最后有很多零,因为我设置了“getcontext()。prec = 500”。
我做错了什么?
我在Python和编程方面不是很有经验。 请不要告诉我计算它的其他可能性,因为它必须是这个(学校)。
更新:使用mpmath模块解决了问题。错误是math.sin()函数中的构建不够精确计算这些微小角度。只需导入'mpmath'而不是'math'和'decimal'并写入mp.sin()。