初学者问题-我正在尝试求解CodeAbbey's Problem #174,“ Pi的计算”,到目前为止,我已经编写了一个函数,该函数可以精确地计算具有6 * N个角的正多边形的边长,从而近似圈。
在下面的代码中,函数x(R,d)打印“ h”和“ side”的正确值(比较CodeAbbey示例中给出的值),但是当我通过pythontutor运行我的代码,我看到它返回值略有不同,例如,对于h的第一个值,它是866025403784438700而不是866025403784438646。
有人可以帮助我理解为什么吗?
您可能会说,我是一个业余爱好者。我从here中提取了isqrt函数,因为对于大x值,math.sqrt(x)方法似乎给出的结果非常不精确>
def isqrt(x):
# Returns the integer square root. This seems to be unproblematic
if x < 0:
raise ValueError('square root not defined for negative numbers')
n = int(x)
if n == 0:
return 0
a, b = divmod(n.bit_length(), 2)
x = 2**(a+b)
while True:
y = (x + n//x)//2
if y >= x:
return x
x = y
def x(R,d):
# given Radius and sidelength of initial polygon,
# this should return sidelength of new polygon.
h = isqrt(R**2 - d**2)
side = isqrt(d**2 + (R-h)**2)
print (h, side) # the values in this line are slightly
return (h, side) # different than the ones here. Why?
def approximate_pi(K,N):
R = int(10**K)
d = R // 2
for i in range(N):
d = (x(R,d)[1] // 2)
return int(6 * 2**(N) * d)
print (approximate_pi(18,4))
答案 0 :(得分:1)
那是Python Tutor的产物。这实际上不是代码中发生的事情。
通过对Python Tutor source code的简要了解,可以发现Python执行后端是一个受黑客攻击的主要是标准CPython实例,它通过bdb
进行了调试,但是可视化使用Javascript。打印的输出来自Python标准输出,但是可视化通过Javascript进行,并且Python整数被转换为Javascript Number值,由于Number是64位浮点数,因此失去了精度。
答案 1 :(得分:0)
与四舍五入到最接近的整数有关。
在您的函数divmod(n.bit_length(), 2)
中,尝试将2更改为2.0,它将产生与您在其平台上看到的相似的值。