mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
adapted to new overloading scheme
This commit is contained in:
parent
74233b34e1
commit
2e61103c0b
2 changed files with 51 additions and 60 deletions
|
|
@ -1,7 +1,10 @@
|
|||
# Rational numbers
|
||||
|
||||
from types import *
|
||||
|
||||
def rat(num, den):
|
||||
if type(num) == FloatType or type(den) == FloatType:
|
||||
return num/den
|
||||
return Rat(num, den)
|
||||
|
||||
|
||||
|
|
@ -16,12 +19,21 @@ class Rat:
|
|||
def __init__(self, num, den):
|
||||
if den == 0:
|
||||
raise ZeroDivisionError, 'rat(x, 0)'
|
||||
g = gcd(num, den)
|
||||
if type(den) == FloatType or type(num) == FloatType:
|
||||
g = float(den)
|
||||
else:
|
||||
g = gcd(num, den)
|
||||
self.num = num/g
|
||||
self.den = den/g
|
||||
|
||||
def __repr__(self):
|
||||
return 'rat' + `self.num, self.den`
|
||||
return 'Rat(%s, %s)' % (self.num, self.den)
|
||||
|
||||
def __str__(self):
|
||||
if self.den == 1:
|
||||
return str(self.num)
|
||||
else:
|
||||
return '%s/%s' % (self.num, self.den)
|
||||
|
||||
def __cmp__(a, b):
|
||||
c = a-b
|
||||
|
|
@ -42,29 +54,23 @@ class Rat:
|
|||
|
||||
def __coerce__(a, b):
|
||||
t = type(b)
|
||||
if t == type(0):
|
||||
return a, rat(b, 1)
|
||||
if t == type(0L):
|
||||
return a, rat(b, 1L)
|
||||
if t == type(0.0):
|
||||
return a.__float__(), b
|
||||
if t == type(a) and a.__class__ == b.__class__:
|
||||
if t == IntType:
|
||||
return a, Rat(b, 1)
|
||||
if t == LongType:
|
||||
return a, Rat(b, 1L)
|
||||
if t == FloatType:
|
||||
return a, Rat(b, 1.0)
|
||||
if t == InstanceType and a.__class__ == b.__class__:
|
||||
return a, b
|
||||
raise TypeError, 'Rat.__coerce__: bad other arg'
|
||||
|
||||
def __add__(a, b):
|
||||
if type(b) <> type(a):
|
||||
a, b = a.__coerce__(b)
|
||||
return a + b
|
||||
return rat(a.num*b.den + b.num*a.den, a.den*b.den)
|
||||
|
||||
def __sub__(a, b):
|
||||
return rat(a.num*b.den - b.num*a.den, a.den*b.den)
|
||||
|
||||
def __mul__(a, b):
|
||||
if type(b) <> type(a):
|
||||
a, b = a.__coerce__(b)
|
||||
return a * b
|
||||
return rat(a.num*b.num, a.den*b.den)
|
||||
|
||||
def __div__(a, b):
|
||||
|
|
@ -75,21 +81,21 @@ class Rat:
|
|||
|
||||
|
||||
def test():
|
||||
print rat(-1L, 1)
|
||||
print rat(1, -1)
|
||||
a = rat(1, 10)
|
||||
print Rat(-1L, 1)
|
||||
print Rat(1, -1)
|
||||
a = Rat(1, 10)
|
||||
print int(a), long(a), float(a)
|
||||
b = rat(2, 5)
|
||||
b = Rat(2, 5)
|
||||
l = [a+b, a-b, a*b, a/b]
|
||||
print l
|
||||
l.sort()
|
||||
print l
|
||||
print rat(0, 1)
|
||||
print Rat(0, 1)
|
||||
print a+1
|
||||
print a+1L
|
||||
print a+1.0
|
||||
try:
|
||||
print rat(1, 0)
|
||||
print Rat(1, 0)
|
||||
raise SystemError, 'should have been ZeroDivisionError'
|
||||
except ZeroDivisionError:
|
||||
print 'OK'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue