为什么sys.maxint<;(sys.maxint-100+;0.01)在Python中?

为什么sys.maxint<;(sys.maxint-100+;0.01)在Python中?,python,floating-point,Python,Floating Point,为什么Python中的sys.maxint

为什么Python中的sys.maxint<(sys.maxint-100+0.01)?

这可能是由于非常大的浮点值的精度损失造成的。(添加
0.01
将右侧转换为浮动)


编辑:我试图对这里发生的事情给出一个确切的解释,但没有用。所以我开始考虑它。

至少在我的机器上不是这样

In [7]: import sys

In [8]: sys.maxint < (sys.maxint - 100 + 0.01)
Out[8]: False
[7]中的
:导入系统
[8]中:sys.maxint<(sys.maxint-100+0.01)
Out[8]:假

在具有64位长的系统上,
sys.maxint
是:

// decimal                  hexadecimal
   9223372036854775807      0x7fffffffffffffff
   9223372036854775707      0x7fffffffffffff9b
因此,sys.maxint-100是:

// decimal                  hexadecimal
   9223372036854775807      0x7fffffffffffffff
   9223372036854775707      0x7fffffffffffff9b
添加
0.01
将强制在添加之前将此值四舍五入为双精度浮点。以双精度表示的两个最接近的值为:

   9223372036854774784      0x7ffffffffffffc00
   9223372036854775808      0x8000000000000000
因为
sys.maxint-100
更接近第二个(更大)值,所以它将向上取整。添加
0.01
将给出:

   9223372036854775808.01   0x8000000000000000.028f5c28f5c...
不能用双精度表示,因此再次四舍五入为:

   9223372036854775808      0x8000000000000000

因此
sys.maxint-100+0.01
的值实际上大于
sys.maxint
的值。然而,在许多现代语言中,整数和浮点之间的比较迫使在进行比较之前将整数值转换为浮点;如果python中是这种情况,
sys.maxint
将被四舍五入到相同的值,并且它们将进行相等的比较。Python中似乎不是这样。我不熟悉python数字的细节,但这是该语言的一个有趣的好奇心。

需要64位才能看到它,在32位上,数字太小,浮点数无法丢失必要的精度。另请参见64位
int(sys.maxint-100+0.01)
的输出:
9223372036854775808L
(而不是
…807L
),但Windows 64位计算机除外,其中sys.maxint始终为2**32/2-1,因为长类型只有32位有符号。@Space_C0wb0y,您所说的
松11位精度是什么意思,这11位是设置为零还是某个随机位字符串?@Saturo:我不太确定(我的解释更像是猜测),但由于这些位刚刚被截断,就好像它们是0,所以结果低于实际数字。@Satoru Logic:他的意思是丢失,而不是丢失。这11位不能“设置”为任何值,它们不存在。您有64名精密乘客可乘坐约53名精密客车。11名乘客失踪。浮点中的11位位置(仍然是64位总线)用于指数位和符号位。请注意,根据定义,浮点中的前导精度位是1,因此不需要座位。您是对的,
assert float(sys.maxint)>(sys.maxint-100+0.01)
您是对的:Python不遗余力地为混合类型比较提供正确的结果。如果没有这一点,Python容器(集合、dict)将陷入麻烦,因为
=
关系用于确定容器成员身份。