Why `divmod(float('inf'), 1) == (float('nan'), float('nan'))`
Terry Reedy
tjreedy at udel.edu
Tue Sep 16 21:12:48 EDT 2014
On 9/16/2014 5:40 PM, cool-RR wrote:
> While debugging my code I found that the bug was because I assumed
> that something like `divmod(float('inf'), 1)` would be equal to
> `(float('inf'), float('nan'))`, while Python returns `(float('nan'),
> float('nan'))`. Why does Python make the division result be NaN in
> this case? `float('inf') / 1` is still `float('inf')`.
For integers, divmod(x, y) is defined as (x // y, x % y) == ((x - x%y)
// y, x % y) == ((x - x%y) / y, x % y).
For floats, Python is documented as using the third expression.
"Help on built-in function divmod in module builtins:
divmod(...)
divmod(x, y) -> (div, mod)
Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x."
It does not really matter, however, as infinity cannot be 'floored' as
required for //
>>> math.floor(float('inf'))
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
math.floor(float('inf'))
OverflowError: cannot convert float infinity to integer
and hence
>>> float('inf') // 1.0
nan
--
Terry Jan Reedy
More information about the Python-list
mailing list