summaryrefslogtreecommitdiffstats
path: root/kcalc/kcalc_core.h
diff options
context:
space:
mode:
Diffstat (limited to 'kcalc/kcalc_core.h')
-rw-r--r--kcalc/kcalc_core.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/kcalc/kcalc_core.h b/kcalc/kcalc_core.h
new file mode 100644
index 0000000..edd33f3
--- /dev/null
+++ b/kcalc/kcalc_core.h
@@ -0,0 +1,181 @@
+/*
+
+ KCalc, a scientific calculator for the X window system using the
+ Qt widget libraries, available at no cost at http://www.troll.no
+
+ Copyright (C) 1996 Bernd Johannes Wuebben
+ wuebben@math.cornell.edu
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef _KCALC_CORE_H
+#define _KCALC_CORE_H
+
+#include "stats.h"
+#include <qvaluestack.h>
+#include "knumber.h"
+
+#define POS_ZERO 1e-19L /* What we consider zero is */
+#define NEG_ZERO -1e-19L /* anything between these two */
+
+
+typedef KNumber (*Arith)(const KNumber &, const KNumber &);
+typedef KNumber (*Prcnt)(const KNumber &, const KNumber &);
+
+#define UNUSED(x) ((void)(x))
+
+
+
+struct operator_data {
+ int precedence; // priority of operators in " enum Operation"
+ Arith arith_ptr;
+ Prcnt prcnt_ptr;
+};
+
+class CalcEngine
+{
+ public:
+ // operations that can be stored in calculation stack
+ enum Operation {
+ FUNC_EQUAL,
+ FUNC_PERCENT,
+ FUNC_BRACKET,
+ FUNC_OR,
+ FUNC_XOR,
+ FUNC_AND,
+ FUNC_LSH,
+ FUNC_RSH,
+ FUNC_ADD,
+ FUNC_SUBTRACT,
+ FUNC_MULTIPLY,
+ FUNC_DIVIDE,
+ FUNC_MOD,
+ FUNC_INTDIV,
+ FUNC_POWER,
+ FUNC_PWR_ROOT
+ };
+
+ CalcEngine();
+
+ KNumber lastOutput(bool &error) const;
+
+ void enterOperation(KNumber num, Operation func);
+
+
+ void ArcCosDeg(KNumber input);
+ void ArcCosRad(KNumber input);
+ void ArcCosGrad(KNumber input);
+ void ArcSinDeg(KNumber input);
+ void ArcSinRad(KNumber input);
+ void ArcSinGrad(KNumber input);
+ void ArcTangensDeg(KNumber input);
+ void ArcTangensRad(KNumber input);
+ void ArcTangensGrad(KNumber input);
+ void AreaCosHyp(KNumber input);
+ void AreaSinHyp(KNumber input);
+ void AreaTangensHyp(KNumber input);
+ void Complement(KNumber input);
+ void CosDeg(KNumber input);
+ void CosRad(KNumber input);
+ void CosGrad(KNumber input);
+ void CosHyp(KNumber input);
+ void Cube(KNumber input);
+ void CubeRoot(KNumber input);
+ void Exp(KNumber input);
+ void Exp10(KNumber input);
+ void Factorial(KNumber input);
+ void InvertSign(KNumber input);
+ void Ln(KNumber input);
+ void Log10(KNumber input);
+ void ParenClose(KNumber input);
+ void ParenOpen(KNumber input);
+ void Reciprocal(KNumber input);
+ void SinDeg(KNumber input);
+ void SinGrad(KNumber input);
+ void SinRad(KNumber input);
+ void SinHyp(KNumber input);
+ void Square(KNumber input);
+ void SquareRoot(KNumber input);
+ void StatClearAll(KNumber input);
+ void StatCount(KNumber input);
+ void StatDataNew(KNumber input);
+ void StatDataDel(KNumber input);
+ void StatMean(KNumber input);
+ void StatMedian(KNumber input);
+ void StatStdDeviation(KNumber input);
+ void StatStdSample(KNumber input);
+ void StatSum(KNumber input);
+ void StatSumSquares(KNumber input);
+ void TangensDeg(KNumber input);
+ void TangensRad(KNumber input);
+ void TangensGrad(KNumber input);
+ void TangensHyp(KNumber input);
+
+ void Reset();
+ private:
+ KStats stats;
+
+ typedef struct {
+ KNumber number;
+ Operation operation;
+ } _node;
+
+ // Stack holds all operations and numbers that have not yet been
+ // processed, e.g. user types "2+3*", the calculation can not be
+ // executed, because "*" has a higher precedence than "+", so we
+ // need to wait for the next number.
+ //
+ // In the stack this would be stored as ((2,+),(3,*),...)
+ //
+ // "enterOperation": If the introduced Operation has lower priority
+ // than the preceding operations in the stack, then we can start to
+ // evaluate the stack (with "evalStack"). Otherwise we append the new
+ // Operation and number to the stack.
+ //
+ // E.g. "2*3+" evaluates to "6+", but "2+3*" can not be evaluated
+ // yet.
+ //
+ // We also take care of brackets, by writing a marker "FUNC_BRACKET"
+ // into the stack, each time the user opens one. When a bracket is
+ // closed, everything in the stack is evaluated until the first
+ // marker "FUNC_BRACKET" found.
+ QValueStack<_node> _stack;
+
+ KNumber _last_number;
+
+ bool _percent_mode;
+
+
+ static const struct operator_data Operator[];
+
+ bool evalStack(void);
+
+ KNumber evalOperation(KNumber arg1, Operation operation, KNumber arg2);
+
+ const KNumber Deg2Rad(const KNumber &x) const
+ { return KNumber(2) * KNumber::Pi / KNumber(360) * x; }
+ const KNumber Gra2Rad(const KNumber &x) const
+ { return KNumber(2)*KNumber::Pi / KNumber(400) * x; }
+ const KNumber Rad2Deg(const KNumber &x) const
+ { return KNumber(360) / (KNumber(2) * KNumber::Pi) * x; }
+ const KNumber Rad2Gra(const KNumber &x) const
+ { return KNumber(400) / (KNumber(2)*KNumber::Pi) * x; }
+
+};
+
+
+#endif //_KCALC_CORE_H