This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Python not IEEE 754 float compliant for various zero operations
Type: behavior Stage: resolved
Components: Interpreter Core Versions: Python 3.7, Python 3.6, Python 3.3, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: LloydVonHans, mark.dickinson, r.david.murray
Priority: normal Keywords:

Created on 2017-07-14 18:25 by LloydVonHans, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg298368 - (view) Author: Bobblehead (LloydVonHans) Date: 2017-07-14 18:25
>>> (-0)**.5
0.0

Should return -0.0

"Except that squareRoot(−0) shall be −0", IEEE 754-2008, Section 5.4.1

>>> 1/(-0.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

>>> 1/(0.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

Should return -inf, and inf respectively.

"For division, when the divisor is zero and the dividend is a finite non-zero number, the sign of the infinity is the exclusive OR of the operands’ signs", IEEE 754-2008, Section 7.3
msg298370 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2017-07-14 19:07
If I remember correctly, the exceptions adhere to the standard because it gives the option of "signaling" in those cases (but in any case it is the behavior we want).  

0.5 is a float, so x**.5 is not the square root.

   >>> math.sqrt(-0.0)
   -0.0

I'm closing this but nosying Mark Dickinson, who will correct me if I got anything wrong :)
msg298371 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2017-07-14 19:20
(-0) ** 0.5 is a power operation, not a square root operation. As such, the relevant part of IEEE 754-2008 is section 9.2.1, "Special values", which says:

> pow (±0, y) is +0 for finite y > 0 and not an odd integer

For the other cases, in general the philosophy is that we should raise exceptions where an FPE would be signalled, in preference to returning infinities and NaNs. So for example `math.sqrt(-1)` raises a ValueError rather than giving a NaN, and 1.0 / 0.0 raises ZeroDivisionError similarly. Unfortunately we don't have complete consistency here: for example 1e300 * 1e300 gives an infinity instead of raising. But that behaviour has been in the language for a looong time, and it's hard to change without breaking existing code.
History
Date User Action Args
2022-04-11 14:58:49adminsetgithub: 75116
2017-07-14 19:20:08mark.dickinsonsetmessages: + msg298371
2017-07-14 19:07:41r.david.murraysetstatus: open -> closed

nosy: + mark.dickinson, r.david.murray
messages: + msg298370

resolution: not a bug
stage: resolved
2017-07-14 18:32:33LloydVonHanssettitle: Python not IEEE 754 float compliant for various zero results -> Python not IEEE 754 float compliant for various zero operations
2017-07-14 18:25:23LloydVonHanscreate