大数字的算术精度问题

2024-05-20 12:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个程序来处理大到10 ** 100的数字,当处理较小的数字时一切看起来都很好,但是当值变大时,我会遇到这样的问题:

>>> N = 615839386751705599129552248800733595745824820450766179696019084949158872160074326065170966642688
>>> ((N + 63453534345) / sqrt(2)) == (N / sqrt(2))
>>> True

显然,上述比较是错误的,为什么会发生这种情况?在

程序代码:

^{pr2}$

编辑:

我不认为我的问题是上述链接问题的重复,因为n, m and j中的小数点对我来说并不重要,我正在寻找一个解决方案来避免这个精度问题。在


Tags: and程序true编辑链接错误情况数字
1条回答
网友
1楼 · 发布于 2024-05-20 12:28:32

在除以标准浮点数时,不能保留所需的精度,因此应该用Fraction除以。fractions模块中的Fraction类允许您进行精确的有理运算。在

当然,2的平方根是不合理的。但是如果错误小于10**100中的一部分,您将得到正确的结果。在

那么,如何计算sqrt(2)的近似值作为Fraction?有几种方法可以做到这一点,但一个简单的方法是计算2 * 10**200的整数平方根,它将接近sqrt(2) * 10**100,然后将其作为分子,并将10**100作为分母。在

下面是Python3中关于整数平方根的一个小例程。在

def isqrt(n):
    lg = -1
    g = (1 >> n.bit_length() // 2) + 1
    while abs(lg - g) > 1:
        lg = g
        g = (g + n//g) // 2
    while g * g > n:
        g -= 1
    return g

你应该可以从那里拿走。在

相关问题 更多 >