fmod and %

Jeff Epler jepler at unpythonic.net
Wed Apr 21 07:33:47 EDT 2004


fmod and % have a different rule about the sign of the returned value.
This is documented both in the language reference and in the library
reference, in the appropriate spots.

http://python.org/doc/current/ref/binary.html#l2h-411
    The % (modulo) operator yields the remainder from the division of
    the first argument by the second. The numeric arguments are first
    converted to a common type. A zero right argument raises the
    ZeroDivisionError exception. The arguments may be floating point
    numbers, e.g., 3.14%0.7 equals 0.34 (since 3.14 equals 4*0.7 + 0.34.)
    The modulo operator always yields a result with the same sign as its
    second operand (or zero); the absolute value of the result is strictly
    smaller than the absolute value of the second operand

    [Footnote:  While abs(x%y) < abs(y) is true mathematically, for
    floats it may not be true numerically due to roundoff. For example,
    and assuming a platform on which a Python float is an IEEE 754
    double-precision number, in order that -1e-100 % 1e100  have the
    same sign as 1e100, the computed result is -1e-100 + 1e100, which
    is numerically exactly equal to 1e100. Function fmod() in the math
    module returns a result whose sign matches the sign of the first
    argument instead, and so returns -1e-100 in this case. Which approach
    is more appropriate depends on the application.]

http://python.org/doc/current/lib/module-math.html#l2h-1105
    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.

Jeff




More information about the Python-list mailing list