Check out ?0 (number) in Wikipedia
Basically IEEE does actually define a negative zero.
And by this definition for all purposes:
-0.0 == +0.0 == 0
I agree with aaronasterling that -0.0
and +0.0
are different objects. Making them equal (equality operator) makes sure that subtle bugs are not introduced in the code.
Think of a * b == c * d
>>> a = 3.4
>>> b =4.4
>>> c = -0.0
>>> d = +0.0
>>> a*c
-0.0
>>> b*d
0.0
>>> a*c == b*d
True
>>>
[Edit: More info based on comments]
When I said for all practical purposes, I had chosen the word rather hastily. I meant standard equality comparison.
As the reference says, the IEEE standard defines comparison so that +0 = -0
, rather than -0 < +0
. Although it would be possible always to ignore the sign of zero, the IEEE standard does not do so. When a multiplication or division involves a signed zero, the usual sign rules apply in computing the sign of the answer.
Operations like divmod
and atan2
exhibit this behavior. In fact, atan2
complies with the IEEE definition as does the underlying "C" lib.
>>> divmod(-0.0,100)
(-0.0, 0.0)
>>> divmod(+0.0,100)
(0.0, 0.0)
>>> math.atan2(0.0, 0.0) == math.atan2(-0.0, 0.0)
True
>>> math.atan2(0.0, -0.0) == math.atan2(-0.0, -0.0)
False
One way is to find out through the documentation, if the implementation complies with IEEE behavior . It also seems from the discussion that there are subtle platform variations too.
However this aspect (IEEE definition compliance) has not been respected everywhere. See the rejection of PEP 754 due to disinterest! I am not sure if this was picked up later.
See also What Every Computer Scientist Should Know About Floating-Point Arithmetic.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…