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