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-12-14 19:58:32 (GMT)
committer Reinier Heeres <rwh@rwh.(none)>2008-12-14 19:58:32 (GMT)
commitf0b95df2389c5686979b489fa5f2084fd3738edf (patch)
tree7b628683c1757622d85977b5007239d6859fedb3
parent79048fef4399b7418ecfaf037b7865bd41c75563 (diff)
Move division code from eqnparser.py to mathlib.py
-rw-r--r--eqnparser.py19
-rw-r--r--mathlib.py38
2 files changed, 35 insertions, 22 deletions
diff --git a/eqnparser.py b/eqnparser.py
index a0cde8f..b09a7c3 100644
--- a/eqnparser.py
+++ b/eqnparser.py
@@ -217,8 +217,8 @@ class EqnParser:
self.register_operator('*', self.OP_DIADIC, 1, lambda x: self.ml.mul(x[0], x[1]))
self.register_operator(u'⨯', self.OP_DIADIC, 1, lambda x: self.ml.mul(x[0], x[1]))
self.register_operator(u'×', self.OP_DIADIC, 1, lambda x: self.ml.mul(x[0], x[1]))
- self.register_operator('/', self.OP_DIADIC, 1, lambda x: self.div_operator(x[0], x[1]))
- self.register_operator(u'÷', self.OP_DIADIC, 1, lambda x: self.div_operator(x[0], x[1]))
+ self.register_operator('/', self.OP_DIADIC, 1, lambda x: self.ml.div(x[0], x[1]))
+ self.register_operator(u'÷', self.OP_DIADIC, 1, lambda x: self.ml.div(x[0], x[1]))
self.register_operator('^', self.OP_DIADIC, 2, lambda x: self.ml.pow(x[0], x[1]))
self.register_operator('**', self.OP_DIADIC, 2, lambda x: self.ml.pow(x[0], x[1]))
@@ -299,10 +299,7 @@ class EqnParser:
self.parse_var[name] = parse
def get_var(self, name):
- if name in self.variables:
- return self.variables[name]
- else:
- return None
+ return self.variables.get(name, None)
def lookup_var(self, name, ps):
c = self.ml.get_constant(name)
@@ -664,13 +661,3 @@ class EqnParser:
ret += op + " "
return ret
- def div_operator(self, a, b):
- if b == 0 or b == 0.0:
- return _('Undefined')
- if isinstance(a, Rational) or isinstance(b, Rational):
- return a / b
- elif self.ml.is_int(a) and float(self.ml.abs(a)) < 1e12 and \
- self.ml.is_int(b) and float(self.ml.abs(b)) < 1e12:
- return Rational(a, b)
- else:
- return self.ml.div(a, b)
diff --git a/mathlib.py b/mathlib.py
index fadb516..a0dad3e 100644
--- a/mathlib.py
+++ b/mathlib.py
@@ -18,6 +18,7 @@
# 2007-07-03: rwh, first version
import types
+import inspect
import math
from decimal import Decimal
from rational import Rational
@@ -34,11 +35,19 @@ class MathLib:
ANGLE_RAD = 1
ANGLE_GRAD = 1
+ MATH_FUNCTIONS = (
+ 'is_int', 'is_bool', 'compare', 'negate', 'abs', 'add', 'sub',
+ 'mul', 'div', 'pow', 'sqrt', 'mod', 'exp', 'ln', 'log10', 'factorial',
+ 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'sinh', 'cosh', 'tanh',
+ 'asinh', 'acosh', 'atanh', 'round', 'floor', 'ceil', 'rand_float',
+ 'rand_int', 'shift_left', 'shift_right', 'factorize',
+ )
+
def __init__(self):
self.constants = {}
self.set_angle_type(self.ANGLE_DEG)
- self.setup_i18n()
+ self._setup_i18n()
#Constants should maybe become variables in eqnparser.py
self.set_constant('true', True)
@@ -57,7 +66,7 @@ class MathLib:
self.set_constant('c_n', self.parse_number('0')) #neutron properties
self.set_constant('m_n', self.parse_number('1.6749272928e-27'))
- def setup_i18n(self):
+ def _setup_i18n(self):
loc = locale.localeconv()
# The separator to mark thousands (default: ',')
@@ -93,6 +102,18 @@ class MathLib:
else:
return None
+ def get_constants(self):
+ return self.constants
+
+ def get_math_functions(self):
+ ret = {}
+ items = inspect.getmembers(self)
+ for key, val in items:
+ if key in self.MATH_FUNCTIONS:
+ ret[key] = val
+
+ return ret
+
def d(self, val):
if isinstance(val, Decimal):
return val
@@ -244,13 +265,18 @@ class MathLib:
return x * y
def div(self, x, y):
+ if y == 0 or y == 0.0:
+ return _('Undefined')
+
+ if self.is_int(x) and float(self.abs(y)) < 1e12 and \
+ self.is_int(x) and float(self.abs(y)) < 1e12:
+ return Rational(x, y)
+
if isinstance(x, Decimal) or isinstance(y, Decimal):
x = self.d(x)
y = self.d(y)
- if y == 0:
- return None
- else:
- return x / y
+
+ return x / y
def pow(self, x, y):
if self.is_int(y):