我在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。我的问题是如何克服它
答案 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)