我在一段代码中遇到了一些问题,最终执行了以下命令行片段。这只是一个实验,我没有在实际代码中的任何变量中存储如此大的值(模 10**9 + 7).
>>> a=1
>>> for i in range(1,101):
... a=a*i
...
>>> b=1
>>> for i in range(1,51):
... b=b*i
...
>>> c=pow(2,50)
>>> a//(b*c)
2725392139750729502980713245400918633290796330545803413734328823443106201171875
>>> a/(b*c)
2.7253921397507295e+78
>>> (a//(b*c))%(10**9 +7)
196932377
>>> (a/(b*c))%(10**9 +7)
45708938.0
>>>
我不明白为什么整数除法给出正确的输出而浮点除法失败。
基本上我计算了:( (100!)/((50!)*(2^50)) ) % (10**9 +7)
请您参考如下方法:
因为精度。
整数和 float 的编码不同。特别是,在 python 3 中,整数可以是任意大的——例如,当您将其转换为二进制时,您给出的整数超过 250 位。无论它们有多大,它们的存储方式都可以容纳。
但是, float 有一定的大小限制——通常是 64 位。这 64 位分为符号(1 位)、尾数和指数 - 尾数中的位数限制了数字的精确度。 Python's documentation contains a section on this limitation .
所以,当你这样做的时候
(a//(b*c))%(10**9 +7)
您正在使用整数执行该计算,而整数又是任意大的。但是,当您这样做时:
(a/(b*c))%(10**9 +7)
您正在使用只有 18 位有效数字的数字执行该计算 - 它已经不精确,并且用它进行更多计算只会进一步破坏答案。
如果您需要使用非常大的 float ,可以使用 python 的 decimal module 来避免这种情况。 (它是标准库的一部分),不会有这些问题。
