29#include "valueconverter.h"
32#include "kspread_cell.h"
33#include "kspread_sheet.h"
48Value func_countblank (valVector args, ValueCalc *calc, FuncExtra *);
56Value func_factdouble (valVector args, ValueCalc *calc, FuncExtra *);
77Value func_multinomial (valVector args, ValueCalc *calc, FuncExtra *);
83Value func_randbetween (valVector args, ValueCalc *calc, FuncExtra *);
84Value func_randbernoulli (valVector args, ValueCalc *calc, FuncExtra *);
85Value func_randbinom (valVector args, ValueCalc *calc, FuncExtra *);
87Value func_randnegbinom (valVector args, ValueCalc *calc, FuncExtra *);
89Value func_randpoisson (valVector args, ValueCalc *calc, FuncExtra *);
92Value func_rounddown (valVector args, ValueCalc *calc, FuncExtra *);
108void RegisterMathFunctions()
110 FunctionRepository* repo = FunctionRepository::self();
119 f = new Function ( "ABS", func_abs);
121 f = new Function ( "CEIL", func_ceil);
123 f = new Function ( "CEILING", func_ceiling);
124 f->setParamCount (1, 2);
126 f = new Function ( "CUR", func_cur);
128 f = new Function ( "EPS", func_eps);
129 f->setParamCount (0);
131 f = new Function ( "EVEN", func_even);
133 f = new Function ( "EXP", func_exp);
135 f = new Function ( "FACT", func_fact);
137 f = new Function ( "FACTDOUBLE", func_factdouble);
139 f = new Function ( "FIB", func_fib);
141 f = new Function ( "FLOOR", func_floor);
143 f = new Function ( "INT", func_int);
145 f = new Function ( "INV", func_inv);
147 f = new Function ( "LN", func_ln);
149 f = new Function ( "LOG", func_log10);
151 f = new Function ( "LOG2", func_log2);
153 f = new Function ( "LOG10", func_log10);
155 f = new Function ( "LOGN", func_logn);
156 f->setParamCount (2);
158 f = new Function ( "MOD", func_mod);
159 f->setParamCount (2);
161 f = new Function ( "MROUND", func_mround);
162 f->setParamCount (2);
164 f = new Function ( "MULTINOMIAL", func_multinomial);
165 f->setParamCount (1, -1);
167 f = new Function ( "ODD", func_odd);
169 f = new Function ( "POW", func_pow);
170 f->setParamCount (2);
172 f = new Function ( "POWER", func_pow);
173 f->setParamCount (2);
175 f = new Function ( "QUOTIENT", func_quotient);
176 f->setParamCount (2);
178 f = new Function ( "RAND", func_rand);
179 f->setParamCount (0);
181 f = new Function ( "RANDBERNOULLI", func_randbernoulli);
183 f = new Function ( "RANDBETWEEN", func_randbetween);
184 f->setParamCount (2);
186 f = new Function ( "RANDBINOM", func_randbinom);
187 f->setParamCount (2);
189 f = new Function ( "RANDEXP", func_randexp);
191 f = new Function ( "RANDNEGBINOM", func_randnegbinom);
192 f->setParamCount (2);
194 f = new Function ( "RANDNORM", func_randnorm);
195 f->setParamCount (2);
197 f = new Function ( "RANDPOISSON", func_randpoisson);
199 f = new Function ( "ROOTN", func_rootn);
200 f->setParamCount (2);
202 f = new Function ( "ROUND", func_round);
203 f->setParamCount (1, 2);
205 f = new Function ( "ROUNDDOWN", func_rounddown);
206 f->setParamCount (1, 2);
208 f = new Function ( "ROUNDUP", func_roundup);
209 f->setParamCount (1, 2);
211 f = new Function ( "SIGN", func_sign);
213 f = new Function ( "SQRT", func_sqrt);
215 f = new Function ( "SQRTPI", func_sqrtpi);
217 f = new Function ( "TRUNC", func_trunc);
218 f->setParamCount (1, 2);
222 f = new Function ( "COUNT", func_count);
223 f->setParamCount (1, -1);
224 f->setAcceptArray ();
226 f = new Function ( "COUNTA", func_counta);
227 f->setParamCount (1, -1);
228 f->setAcceptArray ();
230 f = new Function ( "COUNTBLANK", func_countblank);
231 f->setParamCount (1, -1);
232 f->setAcceptArray ();
234 f = new Function ( "COUNTIF", func_countif);
235 f->setParamCount (2);
236 f->setAcceptArray ();
238 f = new Function ( "DIV", func_div);
239 f->setParamCount (1, -1);
240 f->setAcceptArray ();
242 f = new Function ( "G_PRODUCT", func_kproduct);
243 f->setParamCount (1, -1);
244 f->setAcceptArray ();
246 f = new Function ( "GCD", func_gcd);
247 f->setParamCount (1, -1);
248 f->setAcceptArray ();
250 f = new Function ( "KPRODUCT", func_kproduct);
251 f->setParamCount (1, -1);
252 f->setAcceptArray ();
254 f = new Function ( "LCM", func_lcm);
255 f->setParamCount (1, -1);
256 f->setAcceptArray ();
258 f = new Function ( "MAX", func_max);
259 f->setParamCount (1, -1);
260 f->setAcceptArray ();
262 f = new Function ( "MAXA", func_maxa);
263 f->setParamCount (1, -1);
264 f->setAcceptArray ();
266 f = new Function ( "MDETERM", func_mdeterm);
267 f->setParamCount (1);
268 f->setAcceptArray ();
270 f = new Function ( "MIN", func_min);
271 f->setParamCount (1, -1);
272 f->setAcceptArray ();
274 f = new Function ( "MINA", func_mina);
275 f->setParamCount (1, -1);
276 f->setAcceptArray ();
278 f = new Function ( "MMULT", func_mmult);
279 f->setParamCount (2);
280 f->setAcceptArray ();
282 f = new Function ( "MULTIPLY", func_product);
283 f->setParamCount (1, -1);
284 f->setAcceptArray ();
286 f = new Function ( "PRODUCT", func_product);
287 f->setParamCount (1, -1);
288 f->setAcceptArray ();
290 f = new Function ( "SUM", func_sum);
291 f->setParamCount (1, -1);
292 f->setAcceptArray ();
294 f = new Function ( "SUMA", func_suma);
295 f->setParamCount (1, -1);
296 f->setAcceptArray ();
298 f = new Function ( "SUBTOTAL", func_subtotal);
299 f->setParamCount (2);
300 f->setAcceptArray ();
301 f->setNeedsExtra ( true);
303 f = new Function ( "SUMIF", func_sumif);
304 f->setParamCount (2, 3);
305 f->setAcceptArray ();
307 f = new Function ( "SUMSQ", func_sumsq);
308 f->setParamCount (1, -1);
309 f->setAcceptArray ();
316 return calc->sqrt (args[0]);
323 return calc->sqrt (calc->mul (args[0], calc-> pi()));
329 return calc->pow (args[0], calc->div (1, args[1]));
335 return calc->pow (args[0], 1.0/3.0);
341 return calc->abs (args[0]);
347 return calc->exp (args[0]);
353 return calc->roundUp (args[0], 0);
359 Value number = args[0];
361 if (args.count() == 2)
364 res = calc-> gequal (number, 0.0) ? 1.0 : -1.0;
369 Value d = calc->div (number, res);
375 d = calc->mul (rud, res);
377 d = calc->mul (calc->roundUp (d), res);
391 return calc->ln (args[0]);
397 return calc-> log (args[0], args[1]);
403 return calc-> log (args[0], 2.0);
409 return calc-> log (args[0]);
415 return calc-> sum (args, false);
421 return calc-> sum (args, true);
426 Value checkRange = args[0];
427 TQString condition = calc->conv()->asString (args[1]). asString();
428 Value sumRange = checkRange;
429 if (args.count() == 3)
433 calc-> getCond (cond, condition);
435 return calc->sumIf (sumRange, checkRange, cond);
441 return calc->product (args, 0.0);
447 return calc->product (args, 1.0);
454 for ( unsigned int i = 1; i < args.count(); ++i)
456 val = calc->div (val, args[i]);
467 calc-> arrayWalk (args, res, calc->awFunc ( "sumsq"), 0);
474 Value m = calc->max (args, false);
481 Value m = calc->max (args);
488 Value m = calc->min (args, false);
495 Value m = calc->min (args);
502 return calc->conv()->asInteger (args[0]);
508 if (calc-> isZero (args[1]))
510 return calc->conv()->asInteger (calc->div (args[0], args[1]));
523 return calc->mul (calc->mul (args[0], -1), calc-> random());
526Value func_randbinom (valVector args, ValueCalc *calc, FuncExtra *)
530 double d = calc->conv()->asFloat (args[0]). asFloat();
531 int tr = calc->conv()->asInteger (args[1]). asInteger();
533 if ( d < 0 || d > 1 )
540 double x = pow(1 - d, tr);
541 double r = (double) rand() / ( RAND_MAX + 1.0 );
547 x *= (((tr - i) * d) / ((1 + i) * (1 - d)));
555Value func_randnegbinom (valVector args, ValueCalc *calc, FuncExtra *)
559 double d = calc->conv()->asFloat (args[0]). asFloat();
560 int f = calc->conv()->asInteger (args[1]). asInteger();
562 if ( d < 0 || d > 1 )
570 double x = pow(d, f);
571 double r = (double) rand() / ( RAND_MAX + 1.0 );
577 x *= ( ( ( f + i ) * ( 1 - d ) ) / (1 + i) ) ;
585Value func_randbernoulli (valVector args, ValueCalc *calc, FuncExtra *)
588 return Value (calc-> greater (rnd, args[0]) ? 1.0 : 0.0);
594 Value sigma = args[1];
604 x1 = calc->sub (x1, 1);
605 x1 = calc->sub (x2, 1);
606 w = calc-> add (calc->sqr(x1), calc->sqr (x2));
607 } while (calc-> gequal (w, 1.0));
610 w = calc->sqrt (calc->div (calc->mul (-2.0, calc->ln (w)), w));
611 Value res = calc->mul (x1, w);
613 res = calc-> add (calc->mul (res, sigma), mu);
617Value func_randpoisson (valVector args, ValueCalc *calc, FuncExtra *)
619 if (calc-> lower (args[0], 0))
623 Value x = calc->exp (calc->mul (-1, args[0]));
629 x = calc->mul (x, calc->div (args[0], i + 1));
630 t = calc-> add (t, x);
644Value func_randbetween (valVector args, ValueCalc *calc, FuncExtra *)
652 return calc-> add (v1, calc-> random (calc->sub (v2, v1)));
658 return calc->pow (args[0], args[1]);
664 return calc->mod (args[0], args[1]);
670 return calc-> fact (args[0]);
674Value func_factdouble (valVector args, ValueCalc *calc, FuncExtra *)
680Value func_multinomial (valVector args, ValueCalc *calc, FuncExtra *)
683 Value num = 0, den = 1;
684 for ( unsigned int i = 0; i < args.count(); ++i) {
685 num = calc-> add (num, args[i]);
686 den = calc->mul (den, calc-> fact (args[i]));
688 num = calc-> fact (num);
689 return calc->div (num, den);
695 return Value (calc->sign (args[0]));
701 return calc->mul (args[0], -1);
716 if (calc-> lower (d, 0))
719 d = calc->mul (d, -1);
720 m = calc->mul (m, -1);
724 Value mod = calc->mod (d, m);
725 Value div = calc->sub (d, mod);
728 if (calc-> greater (mod, calc->div (m, 2)))
729 result = calc-> add (result, m);
730 result = calc->mul (result, sign);
736Value func_rounddown (valVector args, ValueCalc *calc, FuncExtra *)
738 if (args.count() == 2)
739 return calc-> roundDown (args[0], args[1]);
746 if (args.count() == 2)
747 return calc->roundUp (args[0], args[1]);
748 return calc->roundUp (args[0], 0);
754 if (args.count() == 2)
755 return calc->round (args[0], args[1]);
756 return calc->round (args[0], 0);
762 const Value value = calc->roundUp (args[0], 0);
763 return calc-> isZero( calc->mod(value, 2) ) ? value : calc-> add(value, 1);
769 const Value value = calc->roundUp (args[0], 0);
770 return calc-> isZero( calc->mod(value, 2) ) ? calc-> add(value, 1) : value;
775 if (args.count() == 1)
777 return calc-> roundDown (args[0], args[1]);
783 return calc->count (args, false);
789 return calc->count (args);
796 for ( unsigned int i = 0; i < args.count(); ++i)
797 if (args[i].isArray()) {
798 int rows = args[i].rows();
799 int cols = args[i].columns();
800 for ( int r = 0; r < rows; ++r)
801 for ( int c = 0; c < cols; ++c)
802 if (args[i].element (c, r).isEmpty())
805 if (args[i].isEmpty())
813 Value range = args[0];
814 TQString condition = calc->conv()->asString (args[1]). asString();
817 calc-> getCond (cond, condition);
819 return calc->countIf (range, cond);
834 Value s = calc->sqrt (5.0);
836 Value u1 = calc->pow (calc->div (calc-> add (1, s), 2), n);
838 Value u2 = calc->pow (calc->div (calc->sub (1, s), 2), n);
840 Value result = calc->div (calc->sub (u1, u2), s);
849 for ( unsigned int row = 0; row < val. rows(); ++row)
850 for ( unsigned int col = 0; col < val. columns(); ++col)
854 v = func_gcd_helper (v, calc);
855 res = calc-> gcd (res, v);
864 for ( unsigned int i = 0; i < args.count(); ++i)
865 if (args[i].isArray())
866 result = calc-> gcd (result, func_gcd_helper (args[i], calc));
868 result = calc-> gcd (result, args[i]);
877 for ( unsigned int row = 0; row < val. rows(); ++row)
878 for ( unsigned int col = 0; col < val. columns(); ++col)
882 v = func_lcm_helper (v, calc);
883 res = calc-> lcm (res, v);
892 for ( unsigned int i = 0; i < args.count(); ++i)
893 if (args[i].isArray())
894 result = calc-> lcm (result, func_lcm_helper (args[i], calc));
896 result = calc-> lcm (result, args[i]);
910 if (n == 1) return matrix. element (0, 0);
911 if (n == 2) return calc->sub (
916 for ( int i = 0; i < n; ++i) {
917 Value smaller (n-1, n-1);
919 for ( int c = 0; c < n; ++c)
922 for ( int r = 1; r < n; r++)
923 smaller.setElement (col, r-1, matrix. element (c, r));
926 Value minor = determinant (calc, smaller);
927 if (i % 2 == 1) minor = calc->mul (minor, -1);
928 res = calc-> add (res, calc->mul (minor, matrix. element (i, 0)));
937 unsigned r = m. rows ();
942 return determinant (calc, args[0]);
950 unsigned r1 = m1. rows ();
952 unsigned r2 = m2. rows ();
961 for (uint row = 0; row < r1; ++row)
962 for (uint col = 0; col < c2; ++col) {
964 for (uint pos = 0; pos < c1; ++pos)
965 val = calc-> add (val,
976Value func_subtotal (valVector args, ValueCalc *calc, FuncExtra *e)
978 int function = calc->conv()->asInteger (args[0]). asInteger();
979 Value range = args[1];
980 int r1 = -1, c1 = -1, r2 = -1, c2 = -1;
982 r1 = e->ranges[1].row1;
983 c1 = e->ranges[1].col1;
984 r2 = e->ranges[1].row2;
985 c2 = e->ranges[1].col2;
991 if ((r1 > 0) && (c1 > 0) && (r2 > 0) && (c2 > 0)) {
992 for ( int r = r1; r <= r2; ++r)
993 for ( int c = c1; c <= c2; ++c) {
994 Cell *cell = e->sheet->cellAt (c, r);
995 if (cell->isDefault())
997 if (cell->isFormula() && cell->text().find ( "SUBTOTAL", 0, false) != -1)
1009 res = calc->avg (range, false);
1012 res = calc->count (range, false);
1015 res = calc->count (range);
1018 res = calc->max (range, false);
1021 res = calc->min (range, false);
1024 res = calc->product (range, 0.0, false);
1027 res = calc->stddev (range, false);
1030 res = calc->stddevP (range, false);
1033 res = calc-> sum (range, false);
1036 f = FunctionRepository::self()->function ( "VAR");
1040 res = f->exec (a, calc, 0);
1043 f = FunctionRepository::self()->function ( "VARP");
1047 res = f->exec (a, calc, 0);
For every cell in the spread sheet there is a Cell object.
The ValueCalc class is used to perform all sorts of calculations.
Value gcd(const Value &a, const Value &b) greatest common divisor
Value random(double range=1.0) random number from <0.0, range)
Value sum(const Value &range, bool full=true) basic range functions
bool gequal(const Value &a, const Value &b) numerical comparison - greater or equal
bool approxEqual(const Value &a, const Value &b) numerical comparison with a little epsilon tolerance
Value factDouble(int which) double factorial (every other number multiplied)
bool greater(const Value &a, const Value &b) numerical comparison
bool isZero(const Value &a) comparison and related
Value roundDown(const Value &a, const Value &digits) rounding
Value fact(const Value &which) some computational functions
void arrayWalk(const Value &range, Value &res, arrayWalkFunc func, Value param) array/range walking
Value log(const Value &number, const Value &base) logarithms and exponentials
void getCond(Condition &cond, Value val) This method parses the condition in string text to the condition cond.
Value lcm(const Value &a, const Value &b) lowest common multiplicator
bool lower(const Value &a, const Value &b) numerical comparison
Value add(const Value &a, const Value &b) basic arithmetic operations
Provides a wrapper for cell value.
unsigned columns() const If this value is an array, return the number of columns.
Value element(unsigned column, unsigned row) const Return an element in the array value.
static const Value & errorDIV0() Returns constant reference to DIV/0!
unsigned rows() const If this value is an array, return the number of rows.
bool isEmpty() const Returns true if empty.
bool isArray() const Returns true if the type of this value is array.
double asFloat() const Returns the floating-point value of this value.
long asInteger() const Returns the integer value of this value.
TQString asString() const Returns the string value of this value.
void setElement(unsigned column, unsigned row, const Value &value) Sets an element in the array value.
static const Value & errorVALUE() Returns constant reference to VALUE!
bool isError() const Returns true if this value holds error information.
|