为什么此函数返回的值与其打印的值不同?

时间:2019-04-13 08:40:43

标签: python

初学者问题-我正在尝试求解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))

2 个答案:

答案 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,它将产生与您在其平台上看到的相似的值。