Calcula Pi en Python con polígonos

Tengo un problema en el cálculo de Pi exactamente. Estoy usando un método donde obtuve un círculo con radio = 1 y dentro de él puse polígonos con 8, 16, 32, 64, … esquinas, doblándolas después de cada paso. Pero el problema es que solo los primeros 15 dígitos decimales del resultado son correctos.

Aquí está el progtwig:

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 

Espero que puedas entenderlo porque está escrito parcialmente en alemán: D Todo lo que hace es tomar un octágono, dividir 360 ° por el número de esquinas (primero 8) y luego por 2. Un ángulo de 22.5 ° es el resultado que el progtwig ahora se pone en un seno para calcular 1/16 del Alcance del octágono, luego duplica el resultado nuevamente y lo multiplica por el número de esquinas del polígono. En el último paso (en la parte superior ^^) duplica el número de esquinas en el polígono y vuelve a ejecutar todos estos pasos.

Aquí hay algunos resultados de los primeros pasos:

 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 

Los 2 últimos resultados son completamente iguales e incorrectos. Esa es la parte correcta: 3.141592653589793 y el rest no lo es. ¿POR QUÉ?

Normalmente, se repetirá la impresión de la última línea del resultado con muchos ceros al final porque configuré “getcontext (). Prec = 500”.

¿Qué he hecho mal?

No tengo mucha experiencia en Python y progtwigción en general. Y, por favor, no me muestres otras posibilidades para calcularlo porque tiene que ser éste (para la escuela).

ACTUALIZACIÓN: Resuelto el problema utilizando el módulo mpmath. El error fue que la comstackción en la función math.sin () no es lo suficientemente precisa para calcular estos pequeños angularjs. Solo importe ‘mpmath’ en lugar de ‘math’ y ‘decimal’ y escriba mp.sin ().

Utiliza getcontext solo para objetos decimales, pero cuando usas funciones matemáticas tradicionales pierdes precisión. Los puntos flotantes de 64 bits proporcionan una precisión de 15 a 17 dígitos decimales significativos .
Tal vez, puede probar con el módulo sympy para obtener más precisión sobre las expresiones simbólicas para su aproximación.