Python中的浮点限制

3 投票
3 回答
1328 浏览
提问于 2025-04-17 09:48

我在用Python写一个程序

import sys

def func(N, M):
    if N == M:
        return 0.00
    else:
        if M == 0:
            return pow(2, N+1) - 2.00
        else :
            return 1.00 + (0.5)*func(N, M+1) + 0.5*func(N, 0)

def main(*args):
    test_cases = int(raw_input())
    while test_cases:
        string = raw_input()
        a = string.split(" ")
        N = int(a[0])
        M = int(a[1])
        test_cases = test_cases -1
        result = func(N, M)
        print("%.2f" % round(result, 2))

if __name__ == '__main__':
        sys.setrecursionlimit(1500)
        sys.exit(main(*sys.argv))

当N=1000,M=1和N=1000,M=2时,它给出的答案是一样的。
我查了一下,发现浮点数的限制在10的400次方以上就会出问题。我的问题是,怎么才能解决这个问题呢?

3 个回答

0

可以考虑使用一种任意精度的浮点数库,比如 bigfloat 这个包,或者 mpmath

2

在Python中,浮点数是按照IEEE双精度标准来处理的,也就是说它们的精度是有限的。如果你的计算只需要用到整数,那就直接使用整数,因为整数是没有精度限制的。不过,很遗憾,我觉得你的计算可能不只是局限于整数。

有一些第三方的库是基于GMP(一个数学库)开发的,可以提供任意精度的浮点数:https://www.google.com/search?q=python%20gmp

2

我维护着一个把Python转换为GMP/MPFR库的项目,我测试了你的函数。经过检查结果和查看你的函数后,我觉得你的函数完全是在处理整数。下面这个函数返回的值和你的函数是一样的:

def func(N, M):
    if M == 0:
        return 2**(N+1) - 2
    elif N == M:
        return 0
    else:
        return func(N, M+1)//2 + 2**N

Python内置的浮点数的限制因素不是指数范围(大约是10的308次方),而是精度(53位)。你需要大约N位的精度才能区分func(N,1)和func(N,2)的结果。

撰写回答