New submission from Elias Zamaria <mikez...@gmail.com>:

Usually, a positive finite number modulo infinity is itself. But modding a 
positive fraction by infinity produces nan:

>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan

Likewise, a positive number modulo negative infinity is usually negative 
infinity, a negative number modulo infinity is usually infinity, and a negative 
number modulo negative infinity is usually itself, unless the number doing the 
modding is a fraction, in which case it produces nan.

I think fractions should behave like other numbers in cases like these. I don't 
think this comes up very often in practical situations, but it is inconsistent 
behavior that may surprise people.

I looked at the fractions module. It seems like this can be fixed by putting 
the following lines at the top of the __mod__ method of the Fraction class:

    if b == math.inf:
        if a >= 0:
            return a
        else:
            return math.inf
    elif b == -math.inf:
        if a >= 0:
            return -math.inf
        else:
            return a


If that is too verbose, it can also be fixed with these lines, although this is 
less understandable IMO:

    if math.isinf(b):
        return a if (a >= 0) == (b > 0) else math.copysign(math.inf, b)


I noticed this in Python 3.6.4 on OS X 10.12.6. If anyone wants, I can come up 
with a patch with some tests.

----------
components: Interpreter Core
messages: 313045
nosy: elias
priority: normal
severity: normal
status: open
title: Fraction modulo infinity should behave consistently with other numbers
versions: Python 3.6, Python 3.7, Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue32968>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to