kcalc
kcalc_core.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _KCALC_CORE_H
00026 #define _KCALC_CORE_H
00027
00028 #include <QStack>
00029 #include "stats.h"
00030 #include "knumber.h"
00031
00032 #define POS_ZERO 1e-19L
00033 #define NEG_ZERO -1e-19L
00034
00035
00036 typedef KNumber (*Arith)(const KNumber &, const KNumber &);
00037 typedef KNumber (*Prcnt)(const KNumber &, const KNumber &);
00038
00039 #define UNUSED(x) ((void)(x))
00040
00041
00042
00043 struct operator_data {
00044 int precedence;
00045 Arith arith_ptr;
00046 Prcnt prcnt_ptr;
00047 };
00048
00049 class CalcEngine
00050 {
00051 public:
00052
00053 enum Operation {
00054 FUNC_EQUAL,
00055 FUNC_PERCENT,
00056 FUNC_BRACKET,
00057 FUNC_OR,
00058 FUNC_XOR,
00059 FUNC_AND,
00060 FUNC_LSH,
00061 FUNC_RSH,
00062 FUNC_ADD,
00063 FUNC_SUBTRACT,
00064 FUNC_MULTIPLY,
00065 FUNC_DIVIDE,
00066 FUNC_MOD,
00067 FUNC_INTDIV,
00068 FUNC_BINOM,
00069 FUNC_POWER,
00070 FUNC_PWR_ROOT
00071 };
00072
00073 CalcEngine();
00074
00075 KNumber lastOutput(bool &error) const;
00076
00077 void enterOperation(KNumber num, Operation func);
00078
00079
00080 void ArcCosDeg(KNumber input);
00081 void ArcCosRad(KNumber input);
00082 void ArcCosGrad(KNumber input);
00083 void ArcSinDeg(KNumber input);
00084 void ArcSinRad(KNumber input);
00085 void ArcSinGrad(KNumber input);
00086 void ArcTangensDeg(KNumber input);
00087 void ArcTangensRad(KNumber input);
00088 void ArcTangensGrad(KNumber input);
00089 void AreaCosHyp(KNumber input);
00090 void AreaSinHyp(KNumber input);
00091 void AreaTangensHyp(KNumber input);
00092 void Complement(KNumber input);
00093 void CosDeg(KNumber input);
00094 void CosRad(KNumber input);
00095 void CosGrad(KNumber input);
00096 void CosHyp(KNumber input);
00097 void Cube(KNumber input);
00098 void CubeRoot(KNumber input);
00099 void Exp(KNumber input);
00100 void Exp10(KNumber input);
00101 void Factorial(KNumber input);
00102 void InvertSign(KNumber input);
00103 void Ln(KNumber input);
00104 void Log10(KNumber input);
00105 void ParenClose(KNumber input);
00106 void ParenOpen(KNumber input);
00107 void Reciprocal(KNumber input);
00108 void SinDeg(KNumber input);
00109 void SinGrad(KNumber input);
00110 void SinRad(KNumber input);
00111 void SinHyp(KNumber input);
00112 void Square(KNumber input);
00113 void SquareRoot(KNumber input);
00114 void StatClearAll(KNumber input);
00115 void StatCount(KNumber input);
00116 void StatDataNew(KNumber input);
00117 void StatDataDel(KNumber input);
00118 void StatMean(KNumber input);
00119 void StatMedian(KNumber input);
00120 void StatStdDeviation(KNumber input);
00121 void StatStdSample(KNumber input);
00122 void StatSum(KNumber input);
00123 void StatSumSquares(KNumber input);
00124 void TangensDeg(KNumber input);
00125 void TangensRad(KNumber input);
00126 void TangensGrad(KNumber input);
00127 void TangensHyp(KNumber input);
00128
00129 void Reset();
00130 private:
00131 KStats stats;
00132
00133 typedef struct {
00134 KNumber number;
00135 Operation operation;
00136 } _node;
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 QStack<_node> _stack;
00158
00159 KNumber _last_number;
00160
00161 bool _percent_mode;
00162
00163
00164 static const struct operator_data Operator[];
00165
00166 bool evalStack(void);
00167
00168 KNumber evalOperation(KNumber arg1, Operation operation, KNumber arg2);
00169
00170 const KNumber Deg2Rad(const KNumber &x) const
00171 { return KNumber(2) * KNumber::Pi / KNumber(360) * x; }
00172 const KNumber Gra2Rad(const KNumber &x) const
00173 { return KNumber(2)*KNumber::Pi / KNumber(400) * x; }
00174 const KNumber Rad2Deg(const KNumber &x) const
00175 { return KNumber(360) / (KNumber(2) * KNumber::Pi) * x; }
00176 const KNumber Rad2Gra(const KNumber &x) const
00177 { return KNumber(400) / (KNumber(2)*KNumber::Pi) * x; }
00178
00179 };
00180
00181
00182 #endif //_KCALC_CORE_H