Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 浮点除法和整数除法给出了不同的答案_Python_Python 3.x - Fatal编程技术网

Python 浮点除法和整数除法给出了不同的答案

Python 浮点除法和整数除法给出了不同的答案,python,python-3.x,Python,Python 3.x,我在一段代码中遇到了一些问题,最后执行了以下命令行代码段。这只是一个实验,我没有在实际代码的任何变量中存储如此大的值(模10**9+7) 我不明白为什么整数除法给出正确的输出,而浮点除法失败 基本上我是这样计算的:((100!)/((50!)*(2^50)))%(10**9+7)原因是整数是精确的,但浮点数受到浮点精度的限制:因为精度 整数和浮点数的编码不同。特别是在Python3中,整数可以任意大——例如,当您将其转换为二进制时,您给出的整数大于250位。它们的存储方式可以容纳它们的大小 然而

我在一段代码中遇到了一些问题,最后执行了以下命令行代码段。这只是一个实验,我没有在实际代码的任何变量中存储如此大的值(模10**9+7)

我不明白为什么整数除法给出正确的输出,而浮点除法失败


基本上我是这样计算的:
((100!)/((50!)*(2^50)))%(10**9+7)

原因是整数是精确的,但浮点数受到浮点精度的限制:

因为精度

整数和浮点数的编码不同。特别是在Python3中,整数可以任意大——例如,当您将其转换为二进制时,您给出的整数大于250位。它们的存储方式可以容纳它们的大小

然而,浮点数被限制在一定的大小——通常是64位。这64位被分为符号(1位)、尾数和指数-尾数中的位数限制了该数字的精度

所以,当你这么做的时候

(a//(b*c))%(10**9 +7)
您正在使用整数执行该计算,而整数又是任意大的。但是,执行此操作时:

(a/(b*c))%(10**9 +7)
你正在用一个只有18位有效数字的数字进行计算——它已经不精确了,用它做更多的计算只会进一步破坏答案


如果需要使用非常大的浮点数,可以使用python(标准库的一部分)来避免这些问题。

因为python中的整数可以是任意大小(即任意数量的有效数字)(受内存限制),但是,对于浮点值(这就是我假设您所说的“十进制”)来说,情况并非如此。有一个名为的模块支持执行任意精度的浮点运算。我认为我不允许导入外部模块,但感谢您的帮助。如果将来需要的话,我将使用这个模块。您似乎将浮点除法称为“十进制除法”。它是浮点除法。有时,您可以在不使用第三方模块的情况下,通过将所有内容转换为整数来进行计算,从而绕过限制。一旦十进制数超过53位限制(以浮点精度计算),会发生什么情况?就像其他数字都被垃圾值填充一样?当一个小数变得太大以至于浮点数无法容纳时,它就失去了精度——其余的数字就消失了。基本上是四舍五入,但是二进制的。例如,四舍五入到五位有效数字的数字
5529771903
将是
5529700000
(a/(b*c))%(10**9 +7)