a little math problem

John Hunter jdhunter at ace.bsd.uchicago.edu
Fri Apr 16 15:05:46 EDT 2004


>>>>> "Jeff" == Jeff Epler <jepler at unpythonic.net> writes:

    Jeff> math.fmod might help Jeff

Doesn't seem to. Eg, 

    >>> 25.2%.2
    0.1999999999999979
    >>> math.fmod(25.2,2)
    1.1999999999999993
    >>> math.fmod(25.2,.2)
    0.1999999999999979

Here is what I have so far - hasn't solved the floating point problem
though


class Base:
    'this solution has floating point inaccuracies'
    def __init__(self, base):
        assert(base>0)
        self.base = base

    def lt(self, x):
        'return the largest multiple of base < x'
        d,m = divmod(x, self.base)
        if m==0: return (d-1)*self.base
        else: return d*self.base

    def le(self, x):
        'return the largest multiple of base <= x'
        d,m = divmod(x, self.base)
        return d*self.base

    def gt(self, x):
        'return the largest multiple of base > x'
        d,m = divmod(x, self.base)
        return (d+1)*self.base


    def ge(self, x):
        'return the largest multiple of base >= x'
        d,m = divmod(x, self.base)
        if m==0: return x
        return (d+1)*self.base

    def get_base(self):
        return self.base


def closeto(x,y):
    print x,y,abs(x-y), abs(x-y) < 1e-12

b = Base(.2)

closeto(b.lt(25.3), 25.2)
closeto(b.lt(25.2), 25.0)
closeto(b.le(25.3), 25.2)
closeto(b.le(25.2), 25.2)

print
closeto(b.gt(25.3), 25.4)
closeto(b.gt(25.2), 25.4)
closeto(b.ge(25.3), 25.4)
closeto(b.ge(25.2), 25.2)

print
print

b = Base(4)

closeto(b.lt(12), 8)
closeto(b.lt(13), 12)
closeto(b.le(12), 12)
closeto(b.le(13), 12)

print

closeto(b.gt(12), 16)
closeto(b.gt(13), 16)
closeto(b.ge(12), 12)
closeto(b.ge(13), 16)


        

        





More information about the Python-list mailing list