Source code for source.rational
# coding: utf-8
[docs]class RationalException(Exception):
def __init__(self, message):
Exception.__init__(self, message)
class Rational(object):
def __init__(self, num=0, den=1):
self.numerator = num
self.denominator = den
self.simplify()
@property
def numerator(self):
return self.__numerator
@numerator.setter
def numerator(self, newNum):
if isinstance(newNum, int) == False:
raise RationalException("Numerator must be an integer")
self.__numerator = newNum
@property
def denominator(self):
return self.__denominator
@denominator.setter
def denominator(self, newDen):
if isinstance(newDen, int) == False:
raise RationalException("Denominator must be an integer")
if newDen == 0:
raise RationalException("Denominator cannot be zero")
self.__denominator = newDen
def simplify(self):
if self.__numerator > self.__denominator:
a = self.__numerator
b = self.__denominator
else:
b = self.__numerator
a = self.__denominator
while True:
rest = a % b
if rest == 0: break
a = b
b = rest
pgcd = b
self.__numerator //= pgcd # Division enti�re
self.__denominator //= pgcd
def __str__(self):
return "[%d/%d]" % (self.__numerator, self.__denominator)
def __add__(self, r2):
return Rational(
self.numerator * r2.denominator + self.denominator * r2.numerator,
self.denominator * r2.denominator
)
# __sub__ __mul__ __truediv__
def __lt__(self, r2):
return self.numerator * r2.denominator < self.denominator * r2.numerator
# __le__ __gt__ __ge__ __eq__ __ne__
def toFloat(self):
return self.__numerator / self.__denominator
def __iter__(self):
self.__iterPos = 0
return self
def next(self): # For Python 2.x
return self.__next__()
def __next__(self): # For Python 3.x
self.__iterPos += 1
if self.__iterPos == 1:
return self.numerator
elif self.__iterPos == 2:
return self.denominator
else:
raise StopIteration()
[docs]def setup(argmn):
"""
"""