Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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_Floating Point_Ieee 754 - Fatal编程技术网

Python 有人能解释这种浮点行为吗?

Python 有人能解释这种浮点行为吗?,python,floating-point,ieee-754,Python,Floating Point,Ieee 754,受此启发,我试图找出那里到底发生了什么(我的答案更直观,但我无法确切理解其原因) 我相信这可以归结为(运行64位Python): Python使用ieee754浮点表示,它实际上有53位表示有效值。然而,据我所知,上面示例中的有效值需要57位(如果去掉隐含的前导1,则为56位)来表示。有人能解释这种差异吗 你错了。它需要1位 >>> (9.2233720368547758e+18).hex() '0x1.0000000000000p+63' 或许以下内容有助于澄清问题: &g

受此启发,我试图找出那里到底发生了什么(我的答案更直观,但我无法确切理解其原因)

我相信这可以归结为(运行64位Python):


Python使用ieee754浮点表示,它实际上有53位表示有效值。然而,据我所知,上面示例中的有效值需要57位(如果去掉隐含的前导1,则为56位)来表示。有人能解释这种差异吗

你错了。它需要1位

>>> (9.2233720368547758e+18).hex()
'0x1.0000000000000p+63'

或许以下内容有助于澄清问题:

>>> hex(int(float(sys.maxint)))
'0x8000000000000000L'
这表明
float(sys.maxint)
实际上是2的幂。因此,在二进制中,它的尾数正好是
1
。在IEEE 754中,前导的
1.
是隐含的,因此在机器表示中,该数字的尾数由所有零位组成

事实上,表示该数字的IEEE位模式如下所示:

0x43E0000000000000

请注意,只有前三个半字节(符号和指数)是非零的。有效位完全由零组成。因此,它不需要56位(实际上也不需要53位)来表示。

当您将sys.maxint转换为浮点或双精度时,结果正好是0x1p63,因为有效位仅包含24位或53位(包括隐式位),因此尾随位会导致向上取整。(sys.maxint是2^63-1,四舍五入产生2^63。)


然后,当您打印此浮点时,一些子例程将其格式化为十进制数字。为此,它计算数字以表示2^63。它能够打印9.2233720368547758e+18并不意味着原始数字包含将其与9.2233720368547759e+18区分开来的位。这意味着其中的位表示9.2233720368547758e+18(大约)。事实上,下一个双精度可表示的浮点数是9223372036854777856(约9.2233720368547778e+18),即2^63+2048。因此,这些整数的低位11位不存在于double中。格式化程序仅显示数字,就好像这些位是零。

非常有趣。如果没有所有其他的零,那一个1位就没有多大用处。@David:当然,但它们都是零,可以一直保持到地平线,直到时间结束。@David:
1
1.000000000000000
之间有什么区别?嗯,我想这是一种精度越低越好的情况——使用更少的位可以消除差异。不过不太实用。记住,Python中的浮点数是以二进制而不是十进制存储的。@Gabe。确切地说:你看到的不是你得到的。float(sys.maxint)是一个内部以二进制形式存储的浮点,其值正好是2**63,或sys.maxint+1,或者确切地说是9223372036854775808.0。键入
float(sys.maxint)
时显示的内容仅是该浮点值的十进制近似值。Python从不为浮点值的
repr
打印超过17个有效数字;要在此处打印准确值,需要19位有效数字。
0x43E0000000000000