Python中的浮点限制
我在用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 个回答
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)的结果。