1

我正在检查doctest并将阶乘示例复制到我的编辑器。因为使用递归感觉更像函数式编程,所以我想像这样更改示例;

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

这种差异的原因是什么?

4

2 回答 2

5

尝试使用factorial(30)而不是运行factorial(30.0)。浮点加法与整数加法不完全一样,所以你会在一段时间后开始看到错误。

考虑:

>>> 1e20 + 1 == 1e20 #True

这是因为您没有足够的精度(位)来唯一地存储这两个数字。(典型的 python 浮点数有 64 位,这意味着您有 2**64 个独特的组合——在1.84e19选项附近。但是,python 浮点数的最大大小sys.float_info.max大约1.8e308在大多数系统上,因此无法存储每个整数值独一无二——尤其是当您认为浮点数可以容纳的不仅仅是整数值时)

就个人而言,我只是将 n 的值转换为您的阶乘函数内的整数,因为阶乘仅针对整数定义——可能会检查以确保abs(int(n) - n) < 1e-5达到该效果。

于 2012-08-30T13:26:50.270 回答
1

您输入的数字是浮点数。由于您没有将其转换为 int,因此您将在输出中得到一个浮点数。

于 2012-08-30T13:26:42.133 回答