Diffstat (limited to 'noncore/apps/opie-sheet/sheet.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-sheet/sheet.cpp | 122 |
1 files changed, 85 insertions, 37 deletions
diff --git a/noncore/apps/opie-sheet/sheet.cpp b/noncore/apps/opie-sheet/sheet.cpp index 88847da..477c982 100644 --- a/noncore/apps/opie-sheet/sheet.cpp +++ b/noncore/apps/opie-sheet/sheet.cpp | |||
@@ -1,29 +1,51 @@ | |||
1 | /*************************************************************************** | 1 | /* |
2 | * * | 2 | =. This file is part of the Opie Project |
3 | * This program is free software; you can redistribute it and/or modify * | 3 | .=l. Copyright (C) 2004 Opie Developer Team <opie-devel@handhelds.org> |
4 | * it under the terms of the GNU General Public License as published by * | 4 | .>+-= |
5 | * the Free Software Foundation; either version 2 of the License, or * | 5 | _;:, .> :=|. This program is free software; you can |
6 | * (at your option) any later version. * | 6 | .> <`_, > . <= redistribute it and/or modify it under |
7 | * * | 7 | :`=1 )Y*s>-.-- : the terms of the GNU General Public |
8 | ***************************************************************************/ | 8 | .="- .-=="i, .._ License as published by the Free Software |
9 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
10 | ._= =} : or (at your option) any later version. | ||
11 | .%`+i> _;_. | ||
12 | .i_,=:_. -<s. This program is distributed in the hope that | ||
13 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
14 | : .. .:, . . . without even the implied warranty of | ||
15 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
16 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
17 | ..}^=.= = ; Library General Public License for more | ||
18 | ++= -. .` .: details. | ||
19 | : = ...= . :.=- | ||
20 | -. .:....=;==+<; You should have received a copy of the GNU | ||
21 | -_. . . )=. = Library General Public License along with | ||
22 | -- :-=` this library; see the file COPYING.LIB. | ||
23 | If not, write to the Free Software Foundation, | ||
24 | Inc., 59 Temple Place - Suite 330, | ||
25 | Boston, MA 02111-1307, USA. | ||
26 | |||
27 | */ | ||
9 | 28 | ||
10 | /* | 29 | /* |
11 | * Opie Sheet (formerly Sheet/Qt) | 30 | * Opie Sheet (formerly Sheet/Qt) |
12 | * by Serdar Ozler <sozler@sitebest.com> | 31 | * by Serdar Ozler <sozler@sitebest.com> |
13 | */ | 32 | */ |
14 | 33 | ||
15 | #include "sheet.h" | 34 | #include "sheet.h" |
16 | 35 | ||
36 | /* QT */ | ||
17 | #include <qmessagebox.h> | 37 | #include <qmessagebox.h> |
38 | |||
39 | /* STD */ | ||
18 | #include <math.h> | 40 | #include <math.h> |
19 | #include <stdlib.h> | 41 | #include <stdlib.h> |
20 | #include <stdio.h> | 42 | #include <stdio.h> |
21 | #include <time.h> | 43 | #include <time.h> |
22 | 44 | ||
23 | #define DEFAULT_COL_WIDTH 50 | 45 | #define DEFAULT_COL_WIDTH 50 |
24 | 46 | ||
25 | Sheet::Sheet(int numRows, int numCols, QWidget *parent) | 47 | Sheet::Sheet(int numRows, int numCols, QWidget *parent) |
26 | :QTable(numRows, numCols, parent) | 48 | :QTable(numRows, numCols, parent) |
27 | { | 49 | { |
28 | defaultBorders.right=defaultBorders.bottom=QPen(Qt::gray, 1, Qt::SolidLine); | 50 | defaultBorders.right=defaultBorders.bottom=QPen(Qt::gray, 1, Qt::SolidLine); |
29 | defaultCellData.data=""; | 51 | defaultCellData.data=""; |
@@ -39,44 +61,44 @@ Sheet::Sheet(int numRows, int numCols, QWidget *parent) | |||
39 | 61 | ||
40 | sheetData.setAutoDelete(TRUE); | 62 | sheetData.setAutoDelete(TRUE); |
41 | clipboardData.setAutoDelete(TRUE); | 63 | clipboardData.setAutoDelete(TRUE); |
42 | for (int i=0; i<numCols; ++i) | 64 | for (int i=0; i<numCols; ++i) |
43 | horizontalHeader()->setLabel(i, getHeaderString(i+1), DEFAULT_COL_WIDTH); | 65 | horizontalHeader()->setLabel(i, getHeaderString(i+1), DEFAULT_COL_WIDTH); |
44 | 66 | ||
45 | 67 | ||
46 | connect(this, SIGNAL(currentChanged(int,int)), this, SLOT(slotCellSelected(int,int))); | 68 | connect(this, SIGNAL(currentChanged(int,int)), this, SLOT(slotCellSelected(int,int))); |
47 | connect(this, SIGNAL(valueChanged(int,int)), this, SLOT(slotCellChanged(int,int))); | 69 | connect(this, SIGNAL(valueChanged(int,int)), this, SLOT(slotCellChanged(int,int))); |
48 | } | 70 | } |
49 | 71 | ||
50 | Sheet::~Sheet() | 72 | Sheet::~Sheet() |
51 | { | 73 | {} |
52 | } | ||
53 | 74 | ||
54 | typeCellData *Sheet::findCellData(int row, int col) | 75 | typeCellData *Sheet::findCellData(int row, int col) |
55 | { | 76 | { |
56 | typeCellData *tempCellData; | 77 | typeCellData *tempCellData; |
57 | for (tempCellData=sheetData.first(); tempCellData; tempCellData=sheetData.next()) | 78 | for (tempCellData=sheetData.first(); tempCellData; tempCellData=sheetData.next()) |
58 | { | 79 | { |
59 | if (tempCellData->row==row && tempCellData->col==col) return tempCellData; | 80 | if (tempCellData->row==row && tempCellData->col==col) return tempCellData; |
60 | } | 81 | } |
61 | return NULL; | 82 | return NULL; |
62 | } | 83 | } |
63 | 84 | ||
64 | void Sheet::slotCellSelected(int row, int col) | 85 | void Sheet::slotCellSelected(int row, int col) |
65 | { | 86 | { |
66 | typeCellData *cellData=findCellData(row, col); | 87 | typeCellData *cellData=findCellData(row, col); |
67 | if (cellData) | 88 | if (cellData) |
68 | { | 89 | { |
69 | emit currentDataChanged(cellData->data); | 90 | emit currentDataChanged(cellData->data); |
70 | }else | 91 | } |
92 | else | ||
71 | emit currentDataChanged(""); | 93 | emit currentDataChanged(""); |
72 | } | 94 | } |
73 | 95 | ||
74 | typeCellData *Sheet::createCellData(int row, int col) | 96 | typeCellData *Sheet::createCellData(int row, int col) |
75 | { | 97 | { |
76 | if (row<0 || col<0) return NULL; | 98 | if (row<0 || col<0) return NULL; |
77 | typeCellData *cellData=new typeCellData; | 99 | typeCellData *cellData=new typeCellData; |
78 | cellData->row=row; | 100 | cellData->row=row; |
79 | cellData->col=col; | 101 | cellData->col=col; |
80 | cellData->data=defaultCellData.data; | 102 | cellData->data=defaultCellData.data; |
81 | cellData->borders=defaultCellData.borders; | 103 | cellData->borders=defaultCellData.borders; |
82 | cellData->alignment=defaultCellData.alignment; | 104 | cellData->alignment=defaultCellData.alignment; |
@@ -219,42 +241,44 @@ QString Sheet::calculateVariable(const QString &variable) | |||
219 | } | 241 | } |
220 | 242 | ||
221 | double Sheet::BesselI0(double x) | 243 | double Sheet::BesselI0(double x) |
222 | { | 244 | { |
223 | //Returns the modi ed Bessel function I0(x) for any real x. | 245 | //Returns the modi ed Bessel function I0(x) for any real x. |
224 | double ax,ans; | 246 | double ax,ans; |
225 | double y; | 247 | double y; |
226 | if ((ax=fabs(x)) < 3.75) | 248 | if ((ax=fabs(x)) < 3.75) |
227 | { | 249 | { |
228 | y=x/3.75; | 250 | y=x/3.75; |
229 | y*=y; | 251 | y*=y; |
230 | ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492 +y*(0.2659732+y*(0.360768e-1+y*0.45813e-2))))); | 252 | ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492 +y*(0.2659732+y*(0.360768e-1+y*0.45813e-2))))); |
231 | }else | 253 | } |
254 | else | ||
232 | { | 255 | { |
233 | y=3.75/ax; | 256 | y=3.75/ax; |
234 | ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1 +y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2 +y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1 +y*0.392377e-2)))))))); | 257 | ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1 +y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2 +y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1 +y*0.392377e-2)))))))); |
235 | } | 258 | } |
236 | return ans; | 259 | return ans; |
237 | }; | 260 | }; |
238 | 261 | ||
239 | double Sheet::BesselI1(double x) | 262 | double Sheet::BesselI1(double x) |
240 | { | 263 | { |
241 | double ax,ans; | 264 | double ax,ans; |
242 | double y; | 265 | double y; |
243 | if ((ax=fabs(x)) < 3.75) | 266 | if ((ax=fabs(x)) < 3.75) |
244 | { | 267 | { |
245 | y=x/3.75; | 268 | y=x/3.75; |
246 | y*=y; | 269 | y*=y; |
247 | ans=ax*(0.5+y*(0.87890594+y*(0.51498869+y*(0.15084934 +y*(0.2658733e-1+y*(0.301532e-2+y*0.32411e-3)))))); | 270 | ans=ax*(0.5+y*(0.87890594+y*(0.51498869+y*(0.15084934 +y*(0.2658733e-1+y*(0.301532e-2+y*0.32411e-3)))))); |
248 | } else | 271 | } |
272 | else | ||
249 | { | 273 | { |
250 | y=3.75/ax; | 274 | y=3.75/ax; |
251 | ans=0.2282967e-1+y*(-0.2895312e-1+y*(0.1787654e-1 -y*0.420059e-2)); ans=0.39894228+y*(-0.3988024e-1+y*(-0.362018e-2 +y*(0.163801e-2+y*(-0.1031555e-1+y*ans)))); | 275 | ans=0.2282967e-1+y*(-0.2895312e-1+y*(0.1787654e-1 -y*0.420059e-2)); ans=0.39894228+y*(-0.3988024e-1+y*(-0.362018e-2 +y*(0.163801e-2+y*(-0.1031555e-1+y*ans)))); |
252 | ans *= (exp(ax)/sqrt(ax)); | 276 | ans *= (exp(ax)/sqrt(ax)); |
253 | } | 277 | } |
254 | return x < 0.0 ? -ans : ans; | 278 | return x < 0.0 ? -ans : ans; |
255 | }; | 279 | }; |
256 | 280 | ||
257 | double Sheet::BesselI(int n, double x) | 281 | double Sheet::BesselI(int n, double x) |
258 | { | 282 | { |
259 | double ACC=40.0; | 283 | double ACC=40.0; |
260 | double BIGNO=1.0e10; | 284 | double BIGNO=1.0e10; |
@@ -283,40 +307,42 @@ double Sheet::BesselI(int n, double x) | |||
283 | ans *= BesselI0(x)/bi; | 307 | ans *= BesselI0(x)/bi; |
284 | return x < 0.0 && (n & 1) ? -ans : ans; | 308 | return x < 0.0 && (n & 1) ? -ans : ans; |
285 | } | 309 | } |
286 | }; | 310 | }; |
287 | 311 | ||
288 | double Sheet::BesselK0(double x) | 312 | double Sheet::BesselK0(double x) |
289 | { | 313 | { |
290 | double y,ans; | 314 | double y,ans; |
291 | if (x <= 2.0) | 315 | if (x <= 2.0) |
292 | { | 316 | { |
293 | y=x*x/4.0; | 317 | y=x*x/4.0; |
294 | ans=(-log(x/2.0)*BesselI0(x))+(-0.57721566+y*(0.42278420 +y*(0.23069756+y*(0.3488590e-1+y*(0.262698e-2 +y*(0.10750e-3+y*0.74e-5)))))); | 318 | ans=(-log(x/2.0)*BesselI0(x))+(-0.57721566+y*(0.42278420 +y*(0.23069756+y*(0.3488590e-1+y*(0.262698e-2 +y*(0.10750e-3+y*0.74e-5)))))); |
295 | } else | 319 | } |
320 | else | ||
296 | { | 321 | { |
297 | y=2.0/x; | 322 | y=2.0/x; |
298 | ans=(exp(-x)/sqrt(x))*(1.25331414+y*(-0.7832358e-1 +y*(0.2189568e-1+y*(-0.1062446e-1+y*(0.587872e-2 +y*(-0.251540e-2+y*0.53208e-3)))))); | 323 | ans=(exp(-x)/sqrt(x))*(1.25331414+y*(-0.7832358e-1 +y*(0.2189568e-1+y*(-0.1062446e-1+y*(0.587872e-2 +y*(-0.251540e-2+y*0.53208e-3)))))); |
299 | } | 324 | } |
300 | return ans; | 325 | return ans; |
301 | }; | 326 | }; |
302 | 327 | ||
303 | double Sheet::BesselK1(double x) | 328 | double Sheet::BesselK1(double x) |
304 | { | 329 | { |
305 | double y,ans; | 330 | double y,ans; |
306 | if (x <= 2.0) | 331 | if (x <= 2.0) |
307 | { | 332 | { |
308 | y=x*x/4.0; | 333 | y=x*x/4.0; |
309 | ans=(log(x/2.0)*BesselI1(x))+(1.0/x)*(1.0+y*(0.15443144 +y*(-0.67278579+y*(-0.18156897+y*(-0.1919402e-1 +y*(-0.110404e-2+y*(-0.4686e-4))))))); | 334 | ans=(log(x/2.0)*BesselI1(x))+(1.0/x)*(1.0+y*(0.15443144 +y*(-0.67278579+y*(-0.18156897+y*(-0.1919402e-1 +y*(-0.110404e-2+y*(-0.4686e-4))))))); |
310 | } else | 335 | } |
336 | else | ||
311 | { | 337 | { |
312 | y=2.0/x; | 338 | y=2.0/x; |
313 | ans=(exp(-x)/sqrt(x))*(1.25331414+y*(0.23498619 +y*(-0.3655620e-1+y*(0.1504268e-1+y*(-0.780353e-2 +y*(0.325614e-2+y*(-0.68245e-3))))))); | 339 | ans=(exp(-x)/sqrt(x))*(1.25331414+y*(0.23498619 +y*(-0.3655620e-1+y*(0.1504268e-1+y*(-0.780353e-2 +y*(0.325614e-2+y*(-0.68245e-3))))))); |
314 | } | 340 | } |
315 | return ans; | 341 | return ans; |
316 | }; | 342 | }; |
317 | 343 | ||
318 | double Sheet::BesselK(int n, double x) | 344 | double Sheet::BesselK(int n, double x) |
319 | { | 345 | { |
320 | int j; | 346 | int j; |
321 | double bk,bkm,bkp,tox; | 347 | double bk,bkm,bkp,tox; |
322 | if (n < 2) return 0.0; | 348 | if (n < 2) return 0.0; |
@@ -333,90 +359,94 @@ double Sheet::BesselK(int n, double x) | |||
333 | }; | 359 | }; |
334 | 360 | ||
335 | double Sheet::BesselJ0(double x) | 361 | double Sheet::BesselJ0(double x) |
336 | { | 362 | { |
337 | double ax,z; | 363 | double ax,z; |
338 | double xx,y,ans,ans1,ans2; | 364 | double xx,y,ans,ans1,ans2; |
339 | if ((ax=fabs(x)) < 8.0) | 365 | if ((ax=fabs(x)) < 8.0) |
340 | { | 366 | { |
341 | y=x*x; | 367 | y=x*x; |
342 | ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456))))); | 368 | ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456))))); |
343 | ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 +y*(59272.64853+y*(267.8532712+y*1.0)))); | 369 | ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 +y*(59272.64853+y*(267.8532712+y*1.0)))); |
344 | ans=ans1/ans2; | 370 | ans=ans1/ans2; |
345 | } else | 371 | } |
372 | else | ||
346 | { | 373 | { |
347 | z=8.0/ax; | 374 | z=8.0/ax; |
348 | y=z*z; | 375 | y=z*z; |
349 | xx=ax-0.785398164; | 376 | xx=ax-0.785398164; |
350 | ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); | 377 | ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); |
351 | ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 -y*0.934935152e-7))); | 378 | ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 -y*0.934935152e-7))); |
352 | ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); | 379 | ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); |
353 | } | 380 | } |
354 | return ans; | 381 | return ans; |
355 | }; | 382 | }; |
356 | 383 | ||
357 | double Sheet::BesselY0(double x) | 384 | double Sheet::BesselY0(double x) |
358 | { | 385 | { |
359 | double z; | 386 | double z; |
360 | double xx,y,ans,ans1,ans2; | 387 | double xx,y,ans,ans1,ans2; |
361 | if (x < 8.0) | 388 | if (x < 8.0) |
362 | { | 389 | { |
363 | y=x*x; | 390 | y=x*x; |
364 | ans1 = -2957821389.0+y*(7062834065.0+y*(-512359803.6 +y*(10879881.29+y*(-86327.92757+y*228.4622733)))); | 391 | ans1 = -2957821389.0+y*(7062834065.0+y*(-512359803.6 +y*(10879881.29+y*(-86327.92757+y*228.4622733)))); |
365 | ans2=40076544269.0+y*(745249964.8+y*(7189466.438 +y*(47447.26470+y*(226.1030244+y*1.0)))); | 392 | ans2=40076544269.0+y*(745249964.8+y*(7189466.438 +y*(47447.26470+y*(226.1030244+y*1.0)))); |
366 | ans=(ans1/ans2)+0.636619772*BesselJ0(x)*log(x); | 393 | ans=(ans1/ans2)+0.636619772*BesselJ0(x)*log(x); |
367 | } else | 394 | } |
395 | else | ||
368 | { | 396 | { |
369 | z=8.0/x; | 397 | z=8.0/x; |
370 | y=z*z; | 398 | y=z*z; |
371 | xx=x-0.785398164; | 399 | xx=x-0.785398164; |
372 | ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); | 400 | ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); |
373 | ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 +y*(-0.934945152e-7)))); | 401 | ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 +y*(-0.934945152e-7)))); |
374 | ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); | 402 | ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); |
375 | } | 403 | } |
376 | return ans; | 404 | return ans; |
377 | }; | 405 | }; |
378 | 406 | ||
379 | double Sheet::BesselJ1(double x) | 407 | double Sheet::BesselJ1(double x) |
380 | { | 408 | { |
381 | double ax,z; | 409 | double ax,z; |
382 | double xx,y,ans,ans1,ans2; | 410 | double xx,y,ans,ans1,ans2; |
383 | if ((ax=fabs(x)) < 8.0) | 411 | if ((ax=fabs(x)) < 8.0) |
384 | { | 412 | { |
385 | y=x*x; | 413 | y=x*x; |
386 | ans1=x*(72362614232.0+y*(-7895059235.0+y*(242396853.1 +y*(-2972611.439+y*(15704.48260+y*(-30.16036606)))))); | 414 | ans1=x*(72362614232.0+y*(-7895059235.0+y*(242396853.1 +y*(-2972611.439+y*(15704.48260+y*(-30.16036606)))))); |
387 | ans2=144725228442.0+y*(2300535178.0+y*(18583304.74 +y*(99447.43394+y*(376.9991397+y*1.0)))); | 415 | ans2=144725228442.0+y*(2300535178.0+y*(18583304.74 +y*(99447.43394+y*(376.9991397+y*1.0)))); |
388 | ans=ans1/ans2; | 416 | ans=ans1/ans2; |
389 | } else | 417 | } |
418 | else | ||
390 | { | 419 | { |
391 | z=8.0/ax; y=z*z; xx=ax-2.356194491; | 420 | z=8.0/ax; y=z*z; xx=ax-2.356194491; |
392 | ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); | 421 | ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); |
393 | ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); | 422 | ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); |
394 | ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); | 423 | ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); |
395 | if (x < 0.0) ans = -ans; | 424 | if (x < 0.0) ans = -ans; |
396 | } | 425 | } |
397 | return ans; | 426 | return ans; |
398 | }; | 427 | }; |
399 | 428 | ||
400 | double Sheet::BesselY1(double x) | 429 | double Sheet::BesselY1(double x) |
401 | { | 430 | { |
402 | double z; | 431 | double z; |
403 | double xx,y,ans,ans1,ans2; | 432 | double xx,y,ans,ans1,ans2; |
404 | if (x < 8.0) | 433 | if (x < 8.0) |
405 | { | 434 | { |
406 | y=x*x; | 435 | y=x*x; |
407 | ans1=x*(-0.4900604943e13+y*(0.1275274390e13 +y*(-0.5153438139e11+y*(0.7349264551e9 +y*(-0.4237922726e7+y*0.8511937935e4))))); | 436 | ans1=x*(-0.4900604943e13+y*(0.1275274390e13 +y*(-0.5153438139e11+y*(0.7349264551e9 +y*(-0.4237922726e7+y*0.8511937935e4))))); |
408 | ans2=0.2499580570e14+y*(0.4244419664e12 +y*(0.3733650367e10+y*(0.2245904002e8 +y*(0.1020426050e6+y*(0.3549632885e3+y))))); | 437 | ans2=0.2499580570e14+y*(0.4244419664e12 +y*(0.3733650367e10+y*(0.2245904002e8 +y*(0.1020426050e6+y*(0.3549632885e3+y))))); |
409 | ans=(ans1/ans2)+0.636619772*(BesselJ1(x)*log(x)-1.0/x); | 438 | ans=(ans1/ans2)+0.636619772*(BesselJ1(x)*log(x)-1.0/x); |
410 | } else | 439 | } |
440 | else | ||
411 | { | 441 | { |
412 | z=8.0/x; | 442 | z=8.0/x; |
413 | y=z*z; | 443 | y=z*z; |
414 | xx=x-2.356194491; | 444 | xx=x-2.356194491; |
415 | ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); | 445 | ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4 +y*(0.2457520174e-5+y*(-0.240337019e-6)))); |
416 | ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); | 446 | ans2=0.04687499995+y*(-0.2002690873e-3 +y*(0.8449199096e-5+y*(-0.88228987e-6 +y*0.105787412e-6))); |
417 | ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); | 447 | ans=sqrt(0.636619772/x)*(sin(xx)*ans1+z*cos(xx)*ans2); |
418 | } | 448 | } |
419 | return ans; | 449 | return ans; |
420 | }; | 450 | }; |
421 | 451 | ||
422 | double Sheet::BesselY(int n, double x) | 452 | double Sheet::BesselY(int n, double x) |
@@ -449,25 +479,26 @@ double Sheet::BesselJ(int n, double x) | |||
449 | else if (ax > (double) n) | 479 | else if (ax > (double) n) |
450 | { | 480 | { |
451 | tox=2.0/ax; | 481 | tox=2.0/ax; |
452 | bjm=BesselJ0(ax); | 482 | bjm=BesselJ0(ax); |
453 | bj=BesselJ1(ax); | 483 | bj=BesselJ1(ax); |
454 | for (j=1;j<n;j++) | 484 | for (j=1;j<n;j++) |
455 | { | 485 | { |
456 | bjp=j*tox*bj-bjm; | 486 | bjp=j*tox*bj-bjm; |
457 | bjm=bj; | 487 | bjm=bj; |
458 | bj=bjp; | 488 | bj=bjp; |
459 | } | 489 | } |
460 | ans=bj; | 490 | ans=bj; |
461 | } else | 491 | } |
492 | else | ||
462 | { | 493 | { |
463 | tox=2.0/ax; | 494 | tox=2.0/ax; |
464 | m=2*((n+(int) sqrt(ACC*n))/2); | 495 | m=2*((n+(int) sqrt(ACC*n))/2); |
465 | jsum=0; | 496 | jsum=0; |
466 | bjp=ans=sum=0.0; | 497 | bjp=ans=sum=0.0; |
467 | bj=1.0; | 498 | bj=1.0; |
468 | for (j=m;j>0;j--) | 499 | for (j=m;j>0;j--) |
469 | { | 500 | { |
470 | bjm=j*tox*bj-bjp; | 501 | bjm=j*tox*bj-bjp; |
471 | bjp=bj; | 502 | bjp=bj; |
472 | bj=bjm; | 503 | bj=bjm; |
473 | if (fabs(bj) > BIGNO) | 504 | if (fabs(bj) > BIGNO) |
@@ -509,25 +540,26 @@ double Sheet::Factorial(double n) | |||
509 | 540 | ||
510 | double Sheet::GammaP(double a, double x) | 541 | double Sheet::GammaP(double a, double x) |
511 | { | 542 | { |
512 | // returns GammaP(a,x) | 543 | // returns GammaP(a,x) |
513 | //void gcf(float *gammcf, float a, float x, float *gln); | 544 | //void gcf(float *gammcf, float a, float x, float *gln); |
514 | //void gser(float *gamser, float a, float x, float *gln); | 545 | //void gser(float *gamser, float a, float x, float *gln); |
515 | double gamser,gammcf,gln; | 546 | double gamser,gammcf,gln; |
516 | if (x < 0.0 || a <= 0.0) return 0.0;//error | 547 | if (x < 0.0 || a <= 0.0) return 0.0;//error |
517 | if (x < (a+1.0)) | 548 | if (x < (a+1.0)) |
518 | { | 549 | { |
519 | GammaSeries(&gamser,a,x,&gln); | 550 | GammaSeries(&gamser,a,x,&gln); |
520 | return gamser; | 551 | return gamser; |
521 | }else | 552 | } |
553 | else | ||
522 | { | 554 | { |
523 | GammaContinuedFraction(&gammcf,a,x,&gln); | 555 | GammaContinuedFraction(&gammcf,a,x,&gln); |
524 | return 1.0-gammcf; | 556 | return 1.0-gammcf; |
525 | } | 557 | } |
526 | }; | 558 | }; |
527 | 559 | ||
528 | double Sheet::GammaQ(double a,double x) | 560 | double Sheet::GammaQ(double a,double x) |
529 | { | 561 | { |
530 | //returns GammaQ(a,x)=1.0 - GammaP(a,x); | 562 | //returns GammaQ(a,x)=1.0 - GammaP(a,x); |
531 | return (1.0-GammaP(a,x)); | 563 | return (1.0-GammaP(a,x)); |
532 | }; | 564 | }; |
533 | 565 | ||
@@ -535,39 +567,41 @@ double Sheet::GammaQ(double a,double x) | |||
535 | void Sheet::GammaSeries(double *gamser, double a, double x, double *gln) | 567 | void Sheet::GammaSeries(double *gamser, double a, double x, double *gln) |
536 | { | 568 | { |
537 | double EPS=3.0e-7; | 569 | double EPS=3.0e-7; |
538 | int ITMAX=100; | 570 | int ITMAX=100; |
539 | int n; | 571 | int n; |
540 | double sum,del,ap; | 572 | double sum,del,ap; |
541 | *gln=GammaLn(a); | 573 | *gln=GammaLn(a); |
542 | if (x <= 0.0) | 574 | if (x <= 0.0) |
543 | { | 575 | { |
544 | if (x < 0.0) return;//error | 576 | if (x < 0.0) return;//error |
545 | *gamser=0.0; | 577 | *gamser=0.0; |
546 | return; | 578 | return; |
547 | } else | 579 | } |
580 | else | ||
548 | { | 581 | { |
549 | ap=a; | 582 | ap=a; |
550 | del=sum=1.0/a; | 583 | del=sum=1.0/a; |
551 | for (n=1;n<=ITMAX;n++) | 584 | for (n=1;n<=ITMAX;n++) |
552 | { | 585 | { |
553 | ++ap; | 586 | ++ap; |
554 | del *= x/ap; | 587 | del *= x/ap; |
555 | sum += del; | 588 | sum += del; |
556 | if (fabs(del) < fabs(sum)*EPS) | 589 | if (fabs(del) < fabs(sum)*EPS) |
557 | { | 590 | { |
558 | *gamser=sum*exp(-x+a*log(x)-(*gln)); | 591 | *gamser=sum*exp(-x+a*log(x)-(*gln)); |
559 | return; | 592 | return; |
560 | } | 593 | } |
561 | } return; | 594 | } |
595 | return; | ||
562 | return; | 596 | return; |
563 | } | 597 | } |
564 | }; | 598 | }; |
565 | 599 | ||
566 | 600 | ||
567 | void Sheet::GammaContinuedFraction(double *gammcf, double a, double x, double *gln) | 601 | void Sheet::GammaContinuedFraction(double *gammcf, double a, double x, double *gln) |
568 | { | 602 | { |
569 | double EPS=3.0e-7; | 603 | double EPS=3.0e-7; |
570 | double FPMIN=1.0e-30; | 604 | double FPMIN=1.0e-30; |
571 | int ITMAX=100; | 605 | int ITMAX=100; |
572 | int i; | 606 | int i; |
573 | double an,b,c,d,del,h; | 607 | double an,b,c,d,del,h; |
@@ -653,25 +687,26 @@ double Sheet::functionSum(const QString ¶m1, const QString ¶m2) | |||
653 | int row1, col1, row2, col2, row, col; | 687 | int row1, col1, row2, col2, row, col; |
654 | double result=0, tempResult; | 688 | double result=0, tempResult; |
655 | bool ok; | 689 | bool ok; |
656 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) | 690 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) |
657 | { | 691 | { |
658 | for (row=row1; row<=row2; ++row) | 692 | for (row=row1; row<=row2; ++row) |
659 | for (col=col1; col<=col2; ++col) | 693 | for (col=col1; col<=col2; ++col) |
660 | { | 694 | { |
661 | tempResult=text(row, col).toDouble(&ok); | 695 | tempResult=text(row, col).toDouble(&ok); |
662 | if (ok) result+=tempResult; | 696 | if (ok) result+=tempResult; |
663 | } | 697 | } |
664 | return result; | 698 | return result; |
665 | }else | 699 | } |
700 | else | ||
666 | { | 701 | { |
667 | double d1=0,d2=0; | 702 | double d1=0,d2=0; |
668 | d1=calculateVariable(param1).toDouble(&ok); | 703 | d1=calculateVariable(param1).toDouble(&ok); |
669 | d2=calculateVariable(param2).toDouble(&ok); | 704 | d2=calculateVariable(param2).toDouble(&ok); |
670 | return(d1+d2); | 705 | return(d1+d2); |
671 | }; | 706 | }; |
672 | return 0; | 707 | return 0; |
673 | } | 708 | } |
674 | 709 | ||
675 | QString Sheet::functionIndex(const QString ¶m1, const QString ¶m2, int indx) | 710 | QString Sheet::functionIndex(const QString ¶m1, const QString ¶m2, int indx) |
676 | { | 711 | { |
677 | int row1, col1, row2, col2, row, col; | 712 | int row1, col1, row2, col2, row, col; |
@@ -780,25 +815,26 @@ double Sheet::functionSumSQ(const QString ¶m1, const QString ¶m2) | |||
780 | int row1, col1, row2, col2, row, col; | 815 | int row1, col1, row2, col2, row, col; |
781 | double result=0, tempResult; | 816 | double result=0, tempResult; |
782 | bool ok; | 817 | bool ok; |
783 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) | 818 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) |
784 | { | 819 | { |
785 | for (row=row1; row<=row2; ++row) | 820 | for (row=row1; row<=row2; ++row) |
786 | for (col=col1; col<=col2; ++col) | 821 | for (col=col1; col<=col2; ++col) |
787 | { | 822 | { |
788 | tempResult=text(row, col).toDouble(&ok); | 823 | tempResult=text(row, col).toDouble(&ok); |
789 | if (ok) result+=tempResult*tempResult; | 824 | if (ok) result+=tempResult*tempResult; |
790 | } | 825 | } |
791 | return result; | 826 | return result; |
792 | }else | 827 | } |
828 | else | ||
793 | { | 829 | { |
794 | double d1=0,d2=0; | 830 | double d1=0,d2=0; |
795 | d1=calculateVariable(param1).toDouble(&ok); | 831 | d1=calculateVariable(param1).toDouble(&ok); |
796 | d2=calculateVariable(param2).toDouble(&ok); | 832 | d2=calculateVariable(param2).toDouble(&ok); |
797 | return(d1*d1+d2*d2); | 833 | return(d1*d1+d2*d2); |
798 | }; | 834 | }; |
799 | return 0; | 835 | return 0; |
800 | } | 836 | } |
801 | 837 | ||
802 | 838 | ||
803 | 839 | ||
804 | double Sheet::functionMin(const QString ¶m1, const QString ¶m2) | 840 | double Sheet::functionMin(const QString ¶m1, const QString ¶m2) |
@@ -810,25 +846,26 @@ double Sheet::functionMin(const QString ¶m1, const QString ¶m2) | |||
810 | { | 846 | { |
811 | for (row=row1; row<=row2; ++row) | 847 | for (row=row1; row<=row2; ++row) |
812 | for (col=col1; col<=col2; ++col) | 848 | for (col=col1; col<=col2; ++col) |
813 | { | 849 | { |
814 | tempMin=text(row, col).toDouble(&ok); | 850 | tempMin=text(row, col).toDouble(&ok); |
815 | if (ok && (!init || tempMin<min)) | 851 | if (ok && (!init || tempMin<min)) |
816 | { | 852 | { |
817 | min=tempMin; | 853 | min=tempMin; |
818 | init=TRUE; | 854 | init=TRUE; |
819 | } | 855 | } |
820 | } | 856 | } |
821 | return min; | 857 | return min; |
822 | }else | 858 | } |
859 | else | ||
823 | { | 860 | { |
824 | double d1=0,d2=0; | 861 | double d1=0,d2=0; |
825 | d1=calculateVariable(param1).toDouble(&ok); | 862 | d1=calculateVariable(param1).toDouble(&ok); |
826 | d2=calculateVariable(param2).toDouble(&ok); | 863 | d2=calculateVariable(param2).toDouble(&ok); |
827 | if(d1<d2) return(d1); else return(d2); | 864 | if(d1<d2) return(d1); else return(d2); |
828 | }; | 865 | }; |
829 | return 0; | 866 | return 0; |
830 | } | 867 | } |
831 | 868 | ||
832 | double Sheet::functionMax(const QString ¶m1, const QString ¶m2) | 869 | double Sheet::functionMax(const QString ¶m1, const QString ¶m2) |
833 | { | 870 | { |
834 | int row1, col1, row2, col2, row, col; | 871 | int row1, col1, row2, col2, row, col; |
@@ -838,25 +875,26 @@ double Sheet::functionMax(const QString ¶m1, const QString ¶m2) | |||
838 | { | 875 | { |
839 | for (row=row1; row<=row2; ++row) | 876 | for (row=row1; row<=row2; ++row) |
840 | for (col=col1; col<=col2; ++col) | 877 | for (col=col1; col<=col2; ++col) |
841 | { | 878 | { |
842 | tempMax=text(row, col).toDouble(&ok); | 879 | tempMax=text(row, col).toDouble(&ok); |
843 | if (ok && (!init || tempMax>max)) | 880 | if (ok && (!init || tempMax>max)) |
844 | { | 881 | { |
845 | max=tempMax; | 882 | max=tempMax; |
846 | init=TRUE; | 883 | init=TRUE; |
847 | } | 884 | } |
848 | }; | 885 | }; |
849 | return max; | 886 | return max; |
850 | }else | 887 | } |
888 | else | ||
851 | { | 889 | { |
852 | double d1=0,d2=0; | 890 | double d1=0,d2=0; |
853 | d1=calculateVariable(param1).toDouble(&ok); | 891 | d1=calculateVariable(param1).toDouble(&ok); |
854 | d2=calculateVariable(param2).toDouble(&ok); | 892 | d2=calculateVariable(param2).toDouble(&ok); |
855 | if(d1>d2) return(d1); else return(d2); | 893 | if(d1>d2) return(d1); else return(d2); |
856 | }; | 894 | }; |
857 | return 0; | 895 | return 0; |
858 | } | 896 | } |
859 | 897 | ||
860 | double Sheet::functionAvg(const QString ¶m1, const QString ¶m2) | 898 | double Sheet::functionAvg(const QString ¶m1, const QString ¶m2) |
861 | { | 899 | { |
862 | double resultSum=functionSum(param1, param2), resultCount=functionCount(param1, param2); | 900 | double resultSum=functionSum(param1, param2), resultCount=functionCount(param1, param2); |
@@ -868,25 +906,26 @@ double Sheet::functionCount(const QString ¶m1, const QString ¶m2) | |||
868 | int row1, col1, row2, col2, row, col; | 906 | int row1, col1, row2, col2, row, col; |
869 | int divider=0; | 907 | int divider=0; |
870 | bool ok; | 908 | bool ok; |
871 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) | 909 | if (findRange(param1, param2, &row1, &col1, &row2, &col2)) |
872 | { | 910 | { |
873 | for (row=row1; row<=row2; ++row) | 911 | for (row=row1; row<=row2; ++row) |
874 | for (col=col1; col<=col2; ++col) | 912 | for (col=col1; col<=col2; ++col) |
875 | { | 913 | { |
876 | text(row, col).toDouble(&ok); | 914 | text(row, col).toDouble(&ok); |
877 | if (ok) ++divider; | 915 | if (ok) ++divider; |
878 | }; | 916 | }; |
879 | return divider; | 917 | return divider; |
880 | }else | 918 | } |
919 | else | ||
881 | { | 920 | { |
882 | double d1=0,d2=0;int ii=0; | 921 | double d1=0,d2=0;int ii=0; |
883 | d1=calculateVariable(param1).toDouble(&ok); | 922 | d1=calculateVariable(param1).toDouble(&ok); |
884 | if (ok) ii++; | 923 | if (ok) ii++; |
885 | d2=calculateVariable(param2).toDouble(&ok); | 924 | d2=calculateVariable(param2).toDouble(&ok); |
886 | if (ok) ii++; | 925 | if (ok) ii++; |
887 | return(ii); | 926 | return(ii); |
888 | }; | 927 | }; |
889 | return 0; | 928 | return 0; |
890 | } | 929 | } |
891 | 930 | ||
892 | double Sheet::functionCountIf(const QString ¶m1, const QString ¶m2, const QString ¶m3) | 931 | double Sheet::functionCountIf(const QString ¶m1, const QString ¶m2, const QString ¶m3) |
@@ -983,51 +1022,55 @@ QString Sheet::calculateFunction(const QString &func, const QString ¶meters, | |||
983 | { | 1022 | { |
984 | val1=calculateVariable(getParameter(parameters, 0)).toDouble(&ok); | 1023 | val1=calculateVariable(getParameter(parameters, 0)).toDouble(&ok); |
985 | val2=calculateVariable(getParameter(parameters, 1)).toDouble(&ok); | 1024 | val2=calculateVariable(getParameter(parameters, 1)).toDouble(&ok); |
986 | if(val1==val2) return QString::number(1); else return QString::number(0); | 1025 | if(val1==val2) return QString::number(1); else return QString::number(0); |
987 | }; | 1026 | }; |
988 | 1027 | ||
989 | //LOGICAL / INFO | 1028 | //LOGICAL / INFO |
990 | if (function=="ISBLANK") | 1029 | if (function=="ISBLANK") |
991 | { | 1030 | { |
992 | if(findRowColumn(getParameter(parameters, 0), &row, &col, FALSE)) | 1031 | if(findRowColumn(getParameter(parameters, 0), &row, &col, FALSE)) |
993 | { | 1032 | { |
994 | if(text(row,col).length()==0) val1=1; else val1=0; | 1033 | if(text(row,col).length()==0) val1=1; else val1=0; |
995 | }else | 1034 | } |
1035 | else | ||
996 | { | 1036 | { |
997 | if(findRowColumn(calculateVariable(getParameter(parameters, 0)), &row,&col, FALSE)) | 1037 | if(findRowColumn(calculateVariable(getParameter(parameters, 0)), &row,&col, FALSE)) |
998 | { | 1038 | { |
999 | if(text(row,col).length()==0) val1=1; else val1=0; | 1039 | if(text(row,col).length()==0) val1=1; else val1=0; |
1000 | }else | 1040 | } |
1041 | else | ||
1001 | { | 1042 | { |
1002 | val1=0; | 1043 | val1=0; |
1003 | }; | 1044 | }; |
1004 | }; | 1045 | }; |
1005 | return QString::number(val1); | 1046 | return QString::number(val1); |
1006 | }; | 1047 | }; |
1007 | 1048 | ||
1008 | 1049 | ||
1009 | if (function=="ISNUMBER") | 1050 | if (function=="ISNUMBER") |
1010 | { | 1051 | { |
1011 | if(findRowColumn(getParameter(parameters, 0, TRUE, function), &row, &col, FALSE)) | 1052 | if(findRowColumn(getParameter(parameters, 0, TRUE, function), &row, &col, FALSE)) |
1012 | { | 1053 | { |
1013 | val1=text(row,col).toDouble(&ok); | 1054 | val1=text(row,col).toDouble(&ok); |
1014 | if(ok) val1=1; else val1=0; | 1055 | if(ok) val1=1; else val1=0; |
1015 | }else | 1056 | } |
1057 | else | ||
1016 | { | 1058 | { |
1017 | if(findRowColumn(calculateVariable(getParameter(parameters, 0, TRUE, function)), &row,&col, FALSE)) | 1059 | if(findRowColumn(calculateVariable(getParameter(parameters, 0, TRUE, function)), &row,&col, FALSE)) |
1018 | { | 1060 | { |
1019 | val1=text(row,col).toDouble(&ok); | 1061 | val1=text(row,col).toDouble(&ok); |
1020 | if(ok) val1=1; else val1=0; | 1062 | if(ok) val1=1; else val1=0; |
1021 | }else | 1063 | } |
1064 | else | ||
1022 | { | 1065 | { |
1023 | val1=0; | 1066 | val1=0; |
1024 | }; | 1067 | }; |
1025 | }; | 1068 | }; |
1026 | return QString::number(val1); | 1069 | return QString::number(val1); |
1027 | }; | 1070 | }; |
1028 | if (function=="AND") | 1071 | if (function=="AND") |
1029 | { | 1072 | { |
1030 | vali=calculateVariable(getParameter(parameters, 0, TRUE, function)).toInt(&ok) | 1073 | vali=calculateVariable(getParameter(parameters, 0, TRUE, function)).toInt(&ok) |
1031 | & calculateVariable(getParameter(parameters, 1, TRUE, function)).toInt(&ok); | 1074 | & calculateVariable(getParameter(parameters, 1, TRUE, function)).toInt(&ok); |
1032 | return QString::number(vali); | 1075 | return QString::number(vali); |
1033 | }; | 1076 | }; |
@@ -1380,25 +1423,26 @@ QString Sheet::calculateFunction(const QString &func, const QString ¶meters, | |||
1380 | s1=s1.lower(); | 1423 | s1=s1.lower(); |
1381 | return QString(s1); | 1424 | return QString(s1); |
1382 | }; | 1425 | }; |
1383 | if (function=="IF") | 1426 | if (function=="IF") |
1384 | { | 1427 | { |
1385 | //usage: IF(param1,param2,param3) | 1428 | //usage: IF(param1,param2,param3) |
1386 | //returns param4 if true(param1)/ param5 if false(param1) | 1429 | //returns param4 if true(param1)/ param5 if false(param1) |
1387 | val1=getParameter(parameters, 0, TRUE, function).toDouble(&ok); | 1430 | val1=getParameter(parameters, 0, TRUE, function).toDouble(&ok); |
1388 | if(val1==1.0) | 1431 | if(val1==1.0) |
1389 | { | 1432 | { |
1390 | s1=calculateVariable(getParameter(parameters, 1, TRUE, function)); | 1433 | s1=calculateVariable(getParameter(parameters, 1, TRUE, function)); |
1391 | return QString(s1); | 1434 | return QString(s1); |
1392 | }else | 1435 | } |
1436 | else | ||
1393 | { | 1437 | { |
1394 | s1=calculateVariable(getParameter(parameters, 2, TRUE, function)); | 1438 | s1=calculateVariable(getParameter(parameters, 2, TRUE, function)); |
1395 | return QString(s1); | 1439 | return QString(s1); |
1396 | }; | 1440 | }; |
1397 | }; | 1441 | }; |
1398 | if (function=="SUM") | 1442 | if (function=="SUM") |
1399 | { | 1443 | { |
1400 | //NumOfParams | 1444 | //NumOfParams |
1401 | val2=0.0; | 1445 | val2=0.0; |
1402 | for(w1=1;w1<=(NumOfParams/2);w1++) | 1446 | for(w1=1;w1<=(NumOfParams/2);w1++) |
1403 | { | 1447 | { |
1404 | val1=functionSum(getParameter(parameters, (w1-1)*2, FALSE, function), getParameter(parameters, (w1-1)*2+1, TRUE, function)); | 1448 | val1=functionSum(getParameter(parameters, (w1-1)*2, FALSE, function), getParameter(parameters, (w1-1)*2+1, TRUE, function)); |
@@ -1543,55 +1587,58 @@ QString Sheet::calculateFunction(const QString &func, const QString ¶meters, | |||
1543 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); | 1587 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); |
1544 | return QString::number(ErrorFunctionComplementary(val2)-ErrorFunctionComplementary(val1)); | 1588 | return QString::number(ErrorFunctionComplementary(val2)-ErrorFunctionComplementary(val1)); |
1545 | }; | 1589 | }; |
1546 | if(function=="POISSON") | 1590 | if(function=="POISSON") |
1547 | { | 1591 | { |
1548 | // POISSON DISTR(x,n,distr/desnt) | 1592 | // POISSON DISTR(x,n,distr/desnt) |
1549 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); | 1593 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); |
1550 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); | 1594 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); |
1551 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); | 1595 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); |
1552 | if(vali==1) | 1596 | if(vali==1) |
1553 | { | 1597 | { |
1554 | return QString::number(GammaQ(floor(val1)+1, val2)); | 1598 | return QString::number(GammaQ(floor(val1)+1, val2)); |
1555 | }else | 1599 | } |
1600 | else | ||
1556 | { | 1601 | { |
1557 | return QString::number(exp(-val2)*pow(val2,val1)/exp(GammaLn(val1+1.0))); | 1602 | return QString::number(exp(-val2)*pow(val2,val1)/exp(GammaLn(val1+1.0))); |
1558 | }; | 1603 | }; |
1559 | }; | 1604 | }; |
1560 | if(function=="CHIDIST") | 1605 | if(function=="CHIDIST") |
1561 | { | 1606 | { |
1562 | // POISSON CHIDIST(x,n,distr/density) | 1607 | // POISSON CHIDIST(x,n,distr/density) |
1563 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); | 1608 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); |
1564 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); | 1609 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); |
1565 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); | 1610 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); |
1566 | if(vali==1) | 1611 | if(vali==1) |
1567 | { | 1612 | { |
1568 | return QString::number(GammaP(val2/2.0,val1*val1/2.0)); | 1613 | return QString::number(GammaP(val2/2.0,val1*val1/2.0)); |
1569 | } else | 1614 | } |
1615 | else | ||
1570 | { | 1616 | { |
1571 | return QString::number( | 1617 | return QString::number( |
1572 | pow(val1,val2-1.0)*exp(-val1*val1/2)/ ( pow(2,val2/2.0-1.0)*exp(GammaLn(val2/2.0))) | 1618 | pow(val1,val2-1.0)*exp(-val1*val1/2)/ ( pow(2,val2/2.0-1.0)*exp(GammaLn(val2/2.0))) |
1573 | ); | 1619 | ); |
1574 | }; | 1620 | }; |
1575 | }; | 1621 | }; |
1576 | if(function=="CHI2DIST") | 1622 | if(function=="CHI2DIST") |
1577 | { | 1623 | { |
1578 | // POISSON CHISQUAREDIST(x,n,distr/density) | 1624 | // POISSON CHISQUAREDIST(x,n,distr/density) |
1579 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); | 1625 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); |
1580 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); | 1626 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); |
1581 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); | 1627 | vali=calculateVariable(getParameter(parameters, 2, TRUE, function)).toInt(&ok); |
1582 | if(vali==1) | 1628 | if(vali==1) |
1583 | { | 1629 | { |
1584 | return QString::number(GammaP(val2/2.0,val1/2.0)); | 1630 | return QString::number(GammaP(val2/2.0,val1/2.0)); |
1585 | } else | 1631 | } |
1632 | else | ||
1586 | { | 1633 | { |
1587 | return QString::number( | 1634 | return QString::number( |
1588 | pow(val1,val2/2.0-1.0)/(exp(val1/2.0)*pow(sqrt(2.0),val2)*exp(GammaLn(val2/2.0))) | 1635 | pow(val1,val2/2.0-1.0)/(exp(val1/2.0)*pow(sqrt(2.0),val2)*exp(GammaLn(val2/2.0))) |
1589 | ); | 1636 | ); |
1590 | }; | 1637 | }; |
1591 | }; | 1638 | }; |
1592 | if(function=="BETAI") | 1639 | if(function=="BETAI") |
1593 | { | 1640 | { |
1594 | // BETA INCOMPLETE BETA(x,a,b) | 1641 | // BETA INCOMPLETE BETA(x,a,b) |
1595 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); | 1642 | val1=calculateVariable(getParameter(parameters, 0, TRUE, function)).toDouble(&ok); |
1596 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); | 1643 | val2=calculateVariable(getParameter(parameters, 1, TRUE, function)).toDouble(&ok); |
1597 | val3=calculateVariable(getParameter(parameters, 2, TRUE, function)).toDouble(&ok); | 1644 | val3=calculateVariable(getParameter(parameters, 2, TRUE, function)).toDouble(&ok); |
@@ -2376,25 +2423,26 @@ void Expression::GetNext() | |||
2376 | } | 2423 | } |
2377 | else | 2424 | else |
2378 | { | 2425 | { |
2379 | break; | 2426 | break; |
2380 | } | 2427 | } |
2381 | } | 2428 | } |
2382 | else | 2429 | else |
2383 | { | 2430 | { |
2384 | break; | 2431 | break; |
2385 | } | 2432 | } |
2386 | }//while | 2433 | }//while |
2387 | }//else if | 2434 | }//else if |
2388 | };//end function | 2435 | } |
2436 | ;//end function | ||
2389 | 2437 | ||
2390 | 2438 | ||
2391 | void Expression::First() | 2439 | void Expression::First() |
2392 | { | 2440 | { |
2393 | GetNext(); | 2441 | GetNext(); |
2394 | if (!(chunk=="") && !ErrorFound) Third(); | 2442 | if (!(chunk=="") && !ErrorFound) Third(); |
2395 | else ErrorFound = true; | 2443 | else ErrorFound = true; |
2396 | }; | 2444 | }; |
2397 | 2445 | ||
2398 | void Expression::Third() | 2446 | void Expression::Third() |
2399 | { | 2447 | { |
2400 | QChar sign, secS='\0'; | 2448 | QChar sign, secS='\0'; |