我是 Python 初学者。我尝试用 Python 语言评估 pi。我在这里使用 Archimedes method .
我的代码是:
import math
from decimal import *
getcontext().prec = 50
pi = 0
PolySides = 6
SideLen = 1
Perim = 6
Dia = 2
while PolySides < 10000000000:
SideLen2 = Decimal(SideLen) / Decimal(2)
radius_a = Decimal(math.sqrt(1 - SideLen2**2))
radius_b = Decimal(1) - Decimal(radius_a)
SideLenNew = Decimal(math.sqrt(SideLen2**2 + radius_b**2))
PolyCircum = Decimal(PolySides * SideLen)
pi = PolyCircum / Dia
print('Polygon Sides:', PolySides, 'Pi = ', pi)
SideLen = SideLenNew
PolySides = 2 * PolySides
但出于某种原因,此代码将 pi 打印到小数点后 14 位。我不明白我在哪里失去了精度。谢谢。
请您参考如下方法:
您在 float 和 decimal 之间穿梭。 math.sqrt 接受一个float 并返回一个float,因此会进行转换,将精度截断为float的。
这些改变就足够了:
while PolySides < 10000000000000000000:
SideLen2 = Decimal(SideLen) / 2
radius_a = (1 - SideLen2**2).sqrt()
radius_b = 1 - radius_a
SideLenNew = (SideLen2**2 + radius_b**2).sqrt()
PolyCircum = Decimal(PolySides * SideLen)
pi = PolyCircum / Dia
print('Polygon Sides:', PolySides, 'Pi = ', pi)
SideLen = SideLenNew
PolySides = 2 * PolySides
