fpspreadsheet: Fix floating point formula tests cases to give matching results even without tolerance value. Fix BIFFExplorer to show all digits of floating point cell values.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3343 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-07-19 23:14:53 +00:00
parent f7d835d70b
commit 03b690d834
4 changed files with 79 additions and 37 deletions

View File

@ -1741,7 +1741,7 @@ begin
'Token tNUM (Number)'); 'Token tNUM (Number)');
numBytes := 8; numBytes := 8;
Move(FBuffer[FBufferIndex], dbl, numBytes); Move(FBuffer[FBufferIndex], dbl, numBytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, FloatToStr(dbl), ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('%g', [dbl]), //FloatToStr(dbl),
'IEEE 754 floating-point value'); 'IEEE 754 floating-point value');
end; end;
$20, $40, $60: $20, $40, $60:
@ -2565,7 +2565,7 @@ begin
// Offset 6: Double value // Offset 6: Double value
numBytes := 8; numBytes := 8;
Move(FBuffer[FBufferIndex], dbl, numBytes); Move(FBuffer[FBufferIndex], dbl, numBytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, FloatToStr(dbl), ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('%g', [dbl]), //FloatToStr(dbl),
'IEEE 764 floating-point value'); 'IEEE 764 floating-point value');
end; end;

View File

@ -142,6 +142,7 @@ end;
procedure TSpreadWriteReadFormulaTests.TestCalcRPNFormulas(AFormat: TsSpreadsheetFormat); procedure TSpreadWriteReadFormulaTests.TestCalcRPNFormulas(AFormat: TsSpreadsheetFormat);
const const
SHEET = 'Sheet1'; SHEET = 'Sheet1';
STATS_NUMBERS: Array[0..4] of Double = (1.0, 1.1, 1.2, 0.9, 0.8);
var var
MyWorksheet: TsWorksheet; MyWorksheet: TsWorksheet;
MyWorkbook: TsWorkbook; MyWorkbook: TsWorkbook;
@ -156,8 +157,15 @@ var
t: TTime; t: TTime;
hr,min,sec,msec: Word; hr,min,sec,msec: Word;
ErrorMargin: double; ErrorMargin: double;
k: Integer;
{ When comparing soll and formula values we must make sure that the soll
values are calculated from double precision numbers, they are used in
the formula calculation as well. The next variables, along with STATS_NUMBERS
above, hold the arguments for the direction function calls. }
number: Double;
numberArray: array[0..4] of Double;
begin begin
ErrorMargin:=1.44E-7; ErrorMargin:=0; //1.44E-7;
//1.44E-7 for SUMSQ formula //1.44E-7 for SUMSQ formula
//6.0E-8 for SUM formula //6.0E-8 for SUM formula
//4.8E-8 for MAX formula //4.8E-8 for MAX formula
@ -208,6 +216,19 @@ begin
CheckEquals(ord(expected.ArgumentType), ord(actual.ArgumentType), CheckEquals(ord(expected.ArgumentType), ord(actual.ArgumentType),
'Test read calculated formula data type mismatch, formula "' + formula + 'Test read calculated formula data type mismatch, formula "' + formula +
'", cell '+CellNotation(MyWorkSheet,Row,1)); '", cell '+CellNotation(MyWorkSheet,Row,1));
// The now function result is volatile, i.e. changes continuously. The
// time for the soll value was created such that we can expect to have
// the file value in the same second. Therefore we neglect the milliseconds.
if formula = '=NOW()' then begin
// Round soll value to seconds
DecodeTime(expected.NumberValue, hr,min,sec,msec);
expected.NumberValue := EncodeTime(hr, min, sec, 0);
// Round formula value to seconds
DecodeTime(actual.NumberValue, hr,min,sec,msec);
actual.NumberValue := EncodeTime(hr,min,sec,0);
end;
case actual.ArgumentType of case actual.ArgumentType of
atBool: atBool:
CheckEquals(BoolToStr(expected.BoolValue), BoolToStr(actual.BoolValue), CheckEquals(BoolToStr(expected.BoolValue), BoolToStr(actual.BoolValue),

View File

@ -99,7 +99,6 @@
<Unit5> <Unit5>
<Filename Value="testsutility.pas"/> <Filename Value="testsutility.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="testsutility"/>
</Unit5> </Unit5>
<Unit6> <Unit6>
<Filename Value="internaltests.pas"/> <Filename Value="internaltests.pas"/>
@ -109,7 +108,6 @@
<Unit7> <Unit7>
<Filename Value="formattests.pas"/> <Filename Value="formattests.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="formattests"/>
</Unit7> </Unit7>
<Unit8> <Unit8>
<Filename Value="colortests.pas"/> <Filename Value="colortests.pas"/>
@ -118,7 +116,6 @@
<Unit9> <Unit9>
<Filename Value="fonttests.pas"/> <Filename Value="fonttests.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="fonttests"/>
</Unit9> </Unit9>
<Unit10> <Unit10>
<Filename Value="optiontests.pas"/> <Filename Value="optiontests.pas"/>
@ -131,6 +128,7 @@
<Unit12> <Unit12>
<Filename Value="rpnformulaunit.pas"/> <Filename Value="rpnformulaunit.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="rpnFormulaUnit"/>
</Unit12> </Unit12>
<Unit13> <Unit13>
<Filename Value="formulatests.pas"/> <Filename Value="formulatests.pas"/>

View File

@ -569,12 +569,15 @@
// ARCCOS - valid result // ARCCOS - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=acos(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=acos(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekACOS, nil)))); RPNFunc(fekACOS, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arccos(0.1)); sollValues[Row] := CreateNumberArg(arccos(number));
// Don't explicitly use the constant here because this will be "extended"
// which is slightly different from the double value used in the formula
// ACOS - error result (arccos is not defined outside the interval [-1..1] // ACOS - error result (arccos is not defined outside the interval [-1..1]
inc(Row); inc(Row);
@ -587,12 +590,13 @@
// ARCCOSH - valid result // ARCCOSH - valid result
inc(Row); inc(Row);
number := 1.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=acosh(1.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=acosh(1.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1.1, RPNNumber(number,
RPNFunc(fekACOSH, nil)))); RPNFunc(fekACOSH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arccosh(1.1)); sollValues[Row] := CreateNumberArg(arccosh(number));
// ACOSH - error result (arccos is not defined below 1 // ACOSH - error result (arccos is not defined below 1
inc(Row); inc(Row);
@ -605,12 +609,13 @@
// ASIN // ASIN
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=asin(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=asin(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekASIN, nil)))); RPNFunc(fekASIN, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arcsin(0.1)); sollValues[Row] := CreateNumberArg(arcsin(number));
// ASIN - error result (arcsin is not defined outside the interval [-1..1] // ASIN - error result (arcsin is not defined outside the interval [-1..1]
inc(Row); inc(Row);
@ -623,30 +628,33 @@
// ARCSINH // ARCSINH
inc(Row); inc(Row);
number := 1.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=asinh(1.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=asinh(1.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1.1, RPNNumber(1.1,
RPNFunc(fekASINH, nil)))); RPNFunc(fekASINH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arcsinh(1.1)); sollValues[Row] := CreateNumberArg(arcsinh(number));
// ATAN // ATAN
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=atan(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=atan(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekATAN, nil)))); RPNFunc(fekATAN, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arctan(0.1)); sollValues[Row] := CreateNumberArg(arctan(number));
// ATANH - valid result // ATANH - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=atanh(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=atanh(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekATANH, nil)))); RPNFunc(fekATANH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(arctanh(0.1)); sollValues[Row] := CreateNumberArg(arctanh(number));
// ATANH - error result (arctan is only defined within ]-1,1[ // ATANH - error result (arctan is only defined within ]-1,1[
inc(Row); inc(Row);
@ -659,21 +667,23 @@
// COS // COS
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=cos(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=cos(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekCOS, nil)))); RPNFunc(fekCOS, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(cos(0.1)); sollValues[Row] := CreateNumberArg(cos(number));
// COSH // COSH
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=cosh(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=cosh(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekCOSH, nil)))); RPNFunc(fekCOSH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(cosh(0.1)); sollValues[Row] := CreateNumberArg(cosh(number));
// DEGREES // DEGREES
inc(Row); inc(Row);
@ -686,12 +696,13 @@
// EXP // EXP
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=exp(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=exp(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekEXP, nil)))); RPNFunc(fekEXP, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(exp(0.1)); sollValues[Row] := CreateNumberArg(exp(number));
// INT (positive argument) // INT (positive argument)
inc(Row); inc(Row);
@ -713,12 +724,13 @@
// LN - valid result // LN - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=ln(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=ln(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekLN, nil)))); RPNFunc(fekLN, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(ln(0.1)); sollValues[Row] := CreateNumberArg(ln(number));
// LN - error due to argument = 0 // LN - error due to argument = 0
inc(Row); inc(Row);
@ -740,12 +752,13 @@
// LOG10 - valid result // LOG10 - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=log10(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=log10(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekLOG10, nil)))); RPNFunc(fekLOG10, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(log10(0.1)); sollValues[Row] := CreateNumberArg(log10(number));
// LOG10 - error due to argument = 0 // LOG10 - error due to argument = 0
inc(Row); inc(Row);
@ -767,13 +780,14 @@
// LOG - valid result (2 arguments) // LOG - valid result (2 arguments)
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=log(0.1, 2)'); MyWorksheet.WriteUTF8Text(Row, 0, '=log(0.1, 2)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNNumber(2, RPNNumber(2,
RPNFunc(fekLOG, 2, nil))))); RPNFunc(fekLOG, 2, nil)))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(logn(2, 0.1)); sollValues[Row] := CreateNumberArg(logn(2, number));
// LOG - valid result (2 arguments, base missing) // LOG - valid result (2 arguments, base missing)
inc(Row); inc(Row);
@ -787,12 +801,13 @@
// LOG - valid result (1 argument) // LOG - valid result (1 argument)
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=log(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=log(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekLOG, 1, nil)))); RPNFunc(fekLOG, 1, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(logn(10, 0.1)); sollValues[Row] := CreateNumberArg(logn(10, number));
// LOG - negative base // LOG - negative base
inc(Row); inc(Row);
@ -883,12 +898,13 @@
// SIN // SIN
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=sin(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=sin(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekSIN, nil)))); RPNFunc(fekSIN, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(sin(0.1)); sollValues[Row] := CreateNumberArg(sin(number));
// SIN of cell value // SIN of cell value
inc(Row); inc(Row);
@ -901,12 +917,13 @@
// SINH // SINH
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=sinh(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=sinh(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekSINH, nil)))); RPNFunc(fekSINH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(sinh(0.1)); sollValues[Row] := CreateNumberArg(sinh(number));
// SINH of cell value // SINH of cell value
inc(Row); inc(Row);
@ -919,12 +936,13 @@
// SQRT - valid result // SQRT - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=sqrt(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=sqrt(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekSQRT, nil)))); RPNFunc(fekSQRT, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(sqrt(0.1)); sollValues[Row] := CreateNumberArg(sqrt(number));
// SQRT - error (negative argument) // SQRT - error (negative argument)
inc(Row); inc(Row);
@ -946,12 +964,13 @@
// TAN - valid result // TAN - valid result
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=tan(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=tan(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekTAN, nil)))); RPNFunc(fekTAN, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(tan(0.1)); sollValues[Row] := CreateNumberArg(tan(number));
// TAN - error (argument = pi/2) // TAN - error (argument = pi/2)
// This test is omitted because it is difficult to exactly hit pi/2. // This test is omitted because it is difficult to exactly hit pi/2.
@ -967,12 +986,13 @@
// TANH // TANH
inc(Row); inc(Row);
number := 0.1;
MyWorksheet.WriteUTF8Text(Row, 0, '=tanh(0.1)'); MyWorksheet.WriteUTF8Text(Row, 0, '=tanh(0.1)');
MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula( MyWorksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.1, RPNNumber(0.1,
RPNFunc(fekTANH, nil)))); RPNFunc(fekTANH, nil))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(tanh(0.1)); sollValues[Row] := CreateNumberArg(tanh(number));
// TANH of cell value // TANH of cell value
inc(Row); inc(Row);
@ -1222,8 +1242,11 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekAVEDEV, 5, nil)))))))); RPNFunc(fekAVEDEV, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(mean([0.0, 0.1, 0.2, 0.1, 0.2])); number := mean(STATS_NUMBERS);
for k := 0 to High(STATS_NUMBERS) do numberArray[k] := abs(STATS_NUMBERS[k] - number);
// these values are the absolute deviations from mean (1.0) // these values are the absolute deviations from mean (1.0)
sollValues[Row] := CreateNumberArg(mean(numberArray));
// AVERAGE // AVERAGE
inc(Row); inc(Row);
MyWorksheet.WriteUTF8Text(Row, 0, '=AVERAGE(1, 1.1, 1.2, 0.9, 0.8)'); MyWorksheet.WriteUTF8Text(Row, 0, '=AVERAGE(1, 1.1, 1.2, 0.9, 0.8)');
@ -1235,7 +1258,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekAVERAGE, 5, nil)))))))); RPNFunc(fekAVERAGE, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(mean([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(mean(STATS_NUMBERS));
// AVERAGE of cell block // AVERAGE of cell block
inc(Row); inc(Row);
@ -1392,7 +1415,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekMAX, 5, nil)))))))); RPNFunc(fekMAX, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(MaxValue([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(MaxValue(STATS_NUMBERS));
// MAX of cell range (no empty cells) // MAX of cell range (no empty cells)
inc(Row); inc(Row);
@ -1423,7 +1446,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekMIN, 5, nil)))))))); RPNFunc(fekMIN, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(MinValue([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(MinValue(STATS_NUMBERS));
// PRODUCT // PRODUCT
inc(Row); inc(Row);
@ -1436,7 +1459,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekPRODUCT, 5, nil)))))))); RPNFunc(fekPRODUCT, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(1.0*1.1*1.2*0.9*0.8); sollValues[Row] := CreateNumberArg(STATS_NUMBERS[0]*STATS_NUMBERS[1]*STATS_NUMBERS[2]*STATS_NUMBERS[3]*STATS_NUMBERS[4]);
// STDEV // STDEV
inc(Row); inc(Row);
@ -1449,7 +1472,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekSTDEV, 5, nil)))))))); RPNFunc(fekSTDEV, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(StdDev([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(StdDev(STATS_NUMBERS));
// STDEVP // STDEVP
inc(Row); inc(Row);
@ -1462,7 +1485,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekSTDEVP, 5, nil)))))))); RPNFunc(fekSTDEVP, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(PopnStdDev([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(PopnStdDev(STATS_NUMBERS));
// SUM // SUM
inc(Row); inc(Row);
@ -1475,7 +1498,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekSUM, 5, nil)))))))); RPNFunc(fekSUM, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(Sum([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(Sum(STATS_NUMBERS));
if AFormat <> sfExcel2 then begin if AFormat <> sfExcel2 then begin
// SUMSQ // SUMSQ
@ -1489,7 +1512,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekSUMSQ, 5, nil)))))))); RPNFunc(fekSUMSQ, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(SumOfSquares([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(SumOfSquares(STATS_NUMBERS));
// SUMIF // SUMIF
inc(Row); inc(Row);
@ -1558,7 +1581,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekVAR, 5, nil)))))))); RPNFunc(fekVAR, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(Variance([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(Variance(STATS_NUMBERS));
// VARP // VARP
inc(Row); inc(Row);
@ -1571,7 +1594,7 @@
RPNNumber(0.8, RPNNumber(0.8,
RPNFunc(fekVARP, 5, nil)))))))); RPNFunc(fekVARP, 5, nil))))))));
SetLength(sollValues, Row+1); SetLength(sollValues, Row+1);
sollValues[Row] := CreateNumberArg(PopnVariance([1.0, 1.1, 1.2, 0.9, 0.8])); sollValues[Row] := CreateNumberArg(PopnVariance(STATS_NUMBERS));
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}