Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinier Heeres <rwh@rwh.(none)>2008-03-06 13:33:28 (GMT)
committer Reinier Heeres <rwh@rwh.(none)>2008-03-06 13:33:28 (GMT)
commit587185cc5c94acb3565f90a7df030d49ffb47639 (patch)
tree6a099899083719db7749d90af55d37b3d3061827
parent4ddf6837a3867dee4230161baf9514b5e175ccf4 (diff)
Implement power operator for Rationals
-rw-r--r--mathlib.py16
-rw-r--r--rational.py7
2 files changed, 18 insertions, 5 deletions
diff --git a/mathlib.py b/mathlib.py
index c47c52d..c81c6f9 100644
--- a/mathlib.py
+++ b/mathlib.py
@@ -96,13 +96,15 @@ class MathLib:
def d(self, val):
if isinstance(val, Decimal):
return val
- elif type(val) is types.FloatType or type(val) is types.IntType:
- s = '%.10e' % val
- d = Decimal(s)
- return d.normalize()
- elif type(val) is types.StringType or type(val) is types.LongType:
+ elif type(val) in (types.IntType, types.LongType):
+ return Decimal(val)
+ elif type(val) == types.StringType:
d = Decimal(val)
return d.normalize()
+ elif type(val) is types.FloatType or hasattr(val, '__float__'):
+ s = '%.10e' % float(val)
+ d = Decimal(s)
+ return d.normalize()
else:
return None
@@ -199,6 +201,8 @@ class MathLib:
if not isinstance(n, Decimal):
n = self.d(n)
+ if n is None:
+ return False
(sign, d, e) = n.normalize().as_tuple()
return e >= 0
@@ -252,6 +256,8 @@ class MathLib:
if self.is_int(y):
if self.is_int(x):
return long(x) ** int(y)
+ elif hasattr(x, '__pow__'):
+ return x ** y
else:
return float(x) ** int(y)
else:
diff --git a/rational.py b/rational.py
index 564d4d9..381b05a 100644
--- a/rational.py
+++ b/rational.py
@@ -130,3 +130,10 @@ class Rational:
self.n = abs(self.n)
self.d = abs(self.d)
+ def __pow__(self, rval):
+ if type(rval) is types.IntType or type(rval) is types.LongType:
+ ret = Rational(self.n ** rval, self.d ** rval)
+ else:
+ ret = float(self.n) ** rval / float(self.d) ** rval
+
+ return ret