Python 为什么-0.0与0.0不同? 我可能缺少一些基本的东西,但请考虑这个解释器SISTION:
您可能认为Python解释器会意识到Python 为什么-0.0与0.0不同? 我可能缺少一些基本的东西,但请考虑这个解释器SISTION: ,python,math,floating-point,Python,Math,Floating Point,您可能认为Python解释器会意识到-0.0和0.0是相同的数字。事实上,它将它们比较为相等: >>> -0.0 == 0.0 True >>> 那么,为什么Python要区分这两者,并为-0.0生成一个全新的对象呢?它不会对整数执行此操作: >>> -0 is 0 True >>> -0 # Sign is not retained 0 >>> 现在,我意识到浮点数是计算机问题的一个巨大来源,但这些
-0.0
和0.0
是相同的数字。事实上,它将它们比较为相等:
>>> -0.0 == 0.0
True
>>>
那么,为什么Python要区分这两者,并为-0.0
生成一个全新的对象呢?它不会对整数执行此操作:
>>> -0 is 0
True
>>> -0 # Sign is not retained
0
>>>
现在,我意识到浮点数是计算机问题的一个巨大来源,但这些问题总是与它们的准确性有关。例如:
>>> 1.3 + 0.1
1.4000000000000001
>>>
但这不是精度问题,是吗?我的意思是,我们这里讨论的是数字的符号,而不是小数点
1我可以在Python 2.7和Python 3.4中重现这种行为,因此这不是一个特定于版本的问题。因为这两个数字的二进制表示形式不同。在0.0中,第32位是0,在-0.0中,第32位是1。在IEEE754(浮点数格式)中,符号是一个单独的位。所以-0.0和0.0在这个位上是不同的。 整数使用二者的补码来表示负数;这就是为什么只有一个
0
使用是您真正想要比较对象实例的唯一方法。否则,特别是对于数字,请使用=
:
>>> 1999+1 is 2000
False
>>> 0.0 == -0.0
True
IEEE浮点算术标准()定义了包含。理论上,它们允许你们区分负数下溢和正数
就python而言,使用=
而不是is
来比较数字。我相信这是IEEE 754浮点表示法的一个特性,这意味着它也不是python特有的。整数溢出可能是更严重的“计算机问题源”为什么要使用is
进行数值比较?你的问题大多与带符号的零无关:试试x=2.3
,y=2.3
,然后是x是y
。然后,为了好玩,试试x=2.3;y=2.3
(全部在一行上),然后是x是y
。继续@MarkDickinson的评论:有一个非常小的文本子集,您分配给它们的任何变量都只是指向它始终存在于内存中的位置的指针。我忘记了原因,但它有点像“永远需要一套基本的价值观”。0、1、2和少数其他整数。其他一切都会被创造出来。注:带x=2;y=2
并且x是y
,您将看到True
。尝试x=-240000;y=-240000
然后x是y
,您将看到False
。希望对下一位访客有所帮助!好啊答案仍然大致相同。浮点中的最后一位是符号位。0表示正1表示负。实际上,在2.x中,Python中的浮点数通常未指定,并在CPython中指定为“用于构建解释器的C编译器中的任何double
”。在3.x中,他们对其进行了一些清理,并在不同的实现中将其指定为“一台机器double
”,但请注意,“您受底层机器体系结构(以及C或Java实现)的支配”。我接受您的回答,因为您解释了浮点情况和整数情况。然而,您能想到-0.0
的任何实际用例吗?我知道它在理论上有一些用途,但它似乎真的很碍事。@iCodez:Signed zero对于实现复杂的数学函数很有用。经典的论文是:William Kahan,复杂初等函数的分支切割,或是关于Nothing符号位的许多琐事。《数值分析的最新进展》,克拉伦登出版社,牛津,1987年。在线副本可以通过Google Scholar轻松找到。请注意,Python并没有特别要求IEEE-754。“这些表示机器级别的双精度浮点数。对于溢出的可接受范围和处理,您将受底层机器体系结构(以及C或Java实现)的支配。”但在大多数平台和实现上,这意味着IEEE-754双倍,或者非常接近它的东西。@njuffa:也在卡汉的网站上。有趣的python知识:注意10+1等于11返回真值。前256个值(以及一些负值)被内部化,因此您总是得到相同的实例。
>>> 1999+1 is 2000
False
>>> 0.0 == -0.0
True