curious problem with large numbers

Dan Bishop danb_83 at yahoo.com
Fri Apr 8 04:38:35 EDT 2005


Chris Fonnesbeck wrote:
> I have been developing a python module for Markov chain Monte Carlo
> estimation, in which I frequently compare variable values with a very
> large number, that I arbitrarily define as:
>
> inf = 1e10000

Don't forget that you can write your own Infinity.

(Warning: Buggy code, especially for unsigned Infinity)

class Infinity(object):
   def __init__(self, sign=1):
      self._sign = cmp(sign, 0)
   def __repr__(self):
      return "Infinity(%d)" % self._sign
   def __str__(self):
      if self._sign == 0:
         return "UInf"
      elif self._sign < 0:
         return "-Inf"
      else:
         return "+Inf"
   def __eq__(self, other):
      return isinstance(other, Infinity) and self._sign == other._sign
   def __ne__(self, other):
      return not (self == other)
   def __le__(self, other):
      if self._sign == 0:
         raise ValueError("Unsigned Infinity is incomparable")
      elif self._sign < 0:
         return True
      else:
         return False
   def __ge__(self, other):
      if self._sign == 0:
         raise ValueError("Unsigned Infinity is incomparable")
      elif self._sign < 0:
         return False
      else:
         return True
   def __lt__(self, other):
      return not (self >= other)
   def __gt__(self, other):
      return not (self <= other)
   def __add__(self, other):
      if isinstance(other, Infinity):
         if self._sign == other._sign:
            return self
         else:
            raise ValueError("%s + %s is undefined" % (self, other))
      else:
         return self
   __radd__ = __add__
   def __neg__(self):
      return Infinity(-self._sign)
   def __sub__(self, other):
      return self + (-other)
   def __rsub__(self, other):
      return -self
   def __mul__(self, other):
      return Infinity(self._sign * other)
   __rmul__ = __mul__
   def __div__(self, other):
      if instance(other, Infinity):
         raise ValueError("Inf/Inf is undefined")
      else:
         return Infinity(self._sign * other)
   __truediv__ = __div__
   __floordiv__ = __div__
   def __rtruediv__(self, other):
      return 0
   __rdiv__ = __rtruediv__
   def __rfloordiv__(self, other):
      if self._sign * cmp(other, 0) < 0:
         return -1
      else:
         return 0

POSITIVE_INFINITY = Infinity(1)
NEGATIVE_INFINITY = Infinity(-1)
UNSIGNED_INFINITY = Infinity(0)




More information about the Python-list mailing list