gpt4 book ai didi

python - 浮点除法与整数除法给出不同的答案

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:11 24 4
gpt4 key购买 nike

我在一段代码中遇到了一些问题,最终执行了以下命令行片段。这只是一个实验,我没有在实际代码中的任何变量中存储如此大的值(模 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 来避免这种情况。 (它是标准库的一部分),不会有这些问题。

关于python - 浮点除法与整数除法给出不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52786571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com