]> jfr.im git - irc/rizon/acid.git/commitdiff
Improve calc function, add sqrt/ceil/floor/log, general improvements
authorDaniel Oaks <redacted>
Thu, 16 Jul 2015 12:26:55 +0000 (12:26 +0000)
committerDaniel Oaks <redacted>
Thu, 16 Jul 2015 12:32:57 +0000 (22:32 +1000)
pyva/pyva/src/main/python/internets/api/calc.py

index d1b516d5facfc298343503f4d6d661a886538238..a0e09327948c7d3911a9248f1d59729aa076e2c2 100644 (file)
@@ -57,7 +57,7 @@ class NumericStringParser(object):
                rpar = Literal(")").suppress()
                addop = plus | minus
                multop = mult | div
-               expop = Literal("^")
+               expop = Literal("^") | Literal("**")
                pi = CaselessLiteral("PI")
                expr = Forward()
                atom = ((Optional(oneOf("- +")) +
@@ -84,11 +84,16 @@ class NumericStringParser(object):
                                        "-": operator.sub,
                                        "*": operator.mul,
                                        "/": operator.truediv,
-                                       "^": operator.pow}
+                                       "^": operator.pow,
+                                       "**": operator.pow}
                self.fn = {"sin": math.sin,
                                   "cos": math.cos,
                                   "tan": math.tan,
+                                  "sqrt": math.sqrt,
+                                  "log": lambda a: math.log(a, 10),
                                   "abs": abs,
+                                  "ceil": math.ceil,
+                                  "floor": math.floor,
                                   "trunc": lambda a: int(a),
                                   "round": round,
                                   "sgn": lambda a: abs(a) > epsilon and cmp(a, 0) or 0}
@@ -97,7 +102,7 @@ class NumericStringParser(object):
                op = s.pop()
                if op == 'unary -':
                        return -self.evaluateStack(s)
-               if op in "+-*/^":
+               if op in ('+', '-', '*', '/', '^', '**'):
                        op2 = self.evaluateStack(s)
                        op1 = self.evaluateStack(s)
                        return self.opn[op](op1, op2)
@@ -105,8 +110,8 @@ class NumericStringParser(object):
                        return math.pi  # 3.1415926535
                elif op == "E":
                        return math.e  # 2.718281828
-               elif op in self.fn:
-                       return self.fn[op](self.evaluateStack(s))
+               elif op.lower() in self.fn:
+                       return self.fn[op.lower()](self.evaluateStack(s))
                elif op[0].isalpha():
                        return 0
                else: