我正在查看doctest并将factorial示例复制到我的编辑器中。由于使用递归感觉更多功能编程,我觉得像这样更改示例;
def factorial(n):
# ... omitted
if n+1 == n: # catch a value like 1e300
raise OverflowError("n too large")
if n == 0:
return 1
else:
return factorial(n - 1) * n
此更改后,其中一个测试失败;
Failed example:
factorial(30.0)
Expected:
265252859812191058636308480000000L
Got:
2.6525285981219103e+32
这种差异的原因是什么?
答案 0 :(得分:5)
尝试使用factorial(30)
代替factorial(30.0)
。浮点加法不像整数加法那样精确,所以你会在一段时间后开始看到错误。
考虑一下:
>>> 1e20 + 1 == 1e20 #True
这是因为您没有足够的精度(位)来唯一地存储这两个数字。 (一个典型的python float有64位意味着你有2 ** 64个独特的组合 - 大概是1.84e19
个选项。但是,python float的最大大小是sys.float_info.max
,大约是{{1}在大多数系统上,所以没有办法唯一地存储每个整数值 - 特别是当你认为浮点数不仅仅包含整数值时)
就个人而言,我只是将n的值转换为factorial函数中的一个整数,因为factorial只是为整数定义的 - 可能会检查以确保1.8e308
或其他类似的东西。
答案 1 :(得分:1)
您输入的数字是浮点数。由于你没有将它转换为int,你将在输出中得到一个浮点数。