Python中的浮点数限制

时间:2012-01-08 15:46:42

标签: python floating-point

我在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 :(得分:2)

Python中的Floats是IEEE双精度:它们不是无限精度。但是如果你的计算只需要整数,那么只需使用整数:它们是无限精度的。不幸的是,我认为你的计算并不在整数范围内。

在GMP上构建了第三方软件包,提供任意精度浮动:https://www.google.com/search?q=python%20gmp

答案 1 :(得分: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)

答案 2 :(得分:0)

考虑使用任意精度浮点库,例如bigfloat包或mpmath