• divmod with negative Decimal values

    From Rob Cliffe@21:1/5 to All on Fri Aug 18 10:14:18 2023
    I am using Python 3.11.4.
    Can anyone explain why Decimal values behave differently from ints when negative values are used in divmod as follows:

    divmod(-1, 60)
    (-1, 59)                                                      # as expected
    divmod(Decimal("-1"), 60)
    (Decimal('-0'), Decimal('-1'))

    Best wishes
    Rob Cliffe

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Thomas Passin@21:1/5 to Rob Cliffe via Python-list on Tue Aug 22 12:49:01 2023
    On 8/18/2023 5:14 AM, Rob Cliffe via Python-list wrote:
    divmod(Decimal("-1"), 60)

    It's not divmod per se, but the modulus operation:

    from decimal import Decimal
    D1 = Decimal(-1)
    D1 % 60 # Decimal(-1)

    fmod() performs the same way:

    from math import fmod
    fmod(-1, 60) # -1.0

    From the Python docs on math.fmod:

    "math.fmod(x, y)
    Return fmod(x, y), as defined by the platform C library. Note that the
    Python expression x % y may not return the same result. The intent of
    the C standard is that fmod(x, y) be exactly (mathematically; to
    infinite precision) equal to x - n*y for some integer n such that the
    result has the same sign as x and magnitude less than abs(y). Python’s x
    % y returns a result with the sign of y instead, and may not be exactly computable for float arguments. For example, fmod(-1e-100, 1e100) is
    -1e-100, but the result of Python’s -1e-100 % 1e100 is 1e100-1e-100,
    which cannot be represented exactly as a float, and rounds to the
    surprising 1e100. For this reason, function fmod() is generally
    preferred when working with floats, while Python’s x % y is preferred
    when working with integers."

    I'm not sure this is helpful in a practical way here ...

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)