formula/source/core/api/vectortoken.cxx | 10 ++++++++-- officecfg/registry/schema/org/openoffice/Office/Calc.xcs | 2 +- sc/source/core/data/grouptokenconverter.cxx | 12 ++++++++++++ sc/source/core/opencl/op_statistical.cxx | 2 +- sc/source/core/tool/calcconfig.cxx | 5 +++++ 5 files changed, 27 insertions(+), 4 deletions(-)
New commits: commit 4cd7b4ab8aeaf61f5e30e4b63e039b7bb9519e85 Author: Tor Lillqvist <t...@collabora.com> Date: Fri Mar 6 11:31:18 2015 +0200 Set #DIV/0! error in VAR() OpenCL implementation when appropriate Returning DBL_MAX doesn't make sense. The traditional C++ implementation and other spreadsheet products return an error. Change-Id: I8189c3ecf4aa7b1df00ec2fd8b91030085848bf4 diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index d47c446..e6fb8e6 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -194,7 +194,7 @@ void OpVar::GenSlidingWindowFunction(std::stringstream &ss, } } ss << " if (fCount <= 1.0)\n"; - ss << " return DBL_MAX;\n"; + ss << " return CreateDoubleError(errDivisionByZero);\n"; ss << " else\n"; ss << " return vSum * pow(fCount - 1.0,-1.0);\n"; ss << "}\n"; commit fa4ce83f567cfb735bdfd2319458585ded4cd554 Author: Tor Lillqvist <t...@collabora.com> Date: Fri Mar 6 11:21:02 2015 +0200 Don't return negative values from ScGroupTokenConverter::trimLength() Surely it doesn't make sense, but we should return zero instead? At the two call sites, there are tests against a zero having been returned, but not against a negative value. And the return value is even passed as the nArrayLength parameter to a formula::DoubleVectorRefToken constructor, which is of type size_t, thus unsigned. Passing for instance -4 to it ends up being interpreted as 18446744073709551612, which has fun consequences. Change-Id: Ifca97cd4bae8e921345bcf9d0ca6bb040e3c3b79 diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx index bfb6de3..da3964c 100644 --- a/sc/source/core/data/grouptokenconverter.cxx +++ b/sc/source/core/data/grouptokenconverter.cxx @@ -63,7 +63,19 @@ SCROW ScGroupTokenConverter::trimLength(SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SC SCROW nLastRow = nRow + nRowLen - 1; // current last row. nLastRow = mrDoc.GetLastDataRow(nTab, nCol1, nCol2, nLastRow); if (nLastRow < (nRow + nRowLen - 1)) + { + // This can end up negative! Was that the original intent, or + // is it accidental? Was it not like that originally but the + // surrounding conditions changed? nRowLen = nLastRow - nRow + 1; + // Anyway, let's assume it doesn't make sense to return a + // negative value here. But should we then return 0 or 1? In + // the "Column is empty" case below, we return 1, why!? And, + // at the callsites there are tests for a zero value returned + // from this function (but not for a negative one). + if (nRowLen < 0) + nRowLen = 0; + } else if (nLastRow == 0) // Column is empty. nRowLen = 1; commit abbd86925dab2621f38c85d8be8772ca56f037f6 Author: Tor Lillqvist <t...@collabora.com> Date: Fri Mar 6 11:35:11 2015 +0200 Add a few SAL_INFOs Change-Id: I252987d6c5e5da56a83742c96b4e86abbb7108c6 diff --git a/formula/source/core/api/vectortoken.cxx b/formula/source/core/api/vectortoken.cxx index b0077aa..99f7dec 100644 --- a/formula/source/core/api/vectortoken.cxx +++ b/formula/source/core/api/vectortoken.cxx @@ -42,7 +42,10 @@ bool VectorRefArray::isValid() const } SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) : - FormulaToken(svSingleVectorRef, ocPush), maArray(rArray), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength) {} + FormulaToken(svSingleVectorRef, ocPush), maArray(rArray), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength) +{ + SAL_INFO("formula.core", "Created SingleVectorRefToken nReqLength=" << nReqLength << " nArrayLength=" << nArrayLength); +} FormulaToken* SingleVectorRefToken::Clone() const { @@ -64,7 +67,10 @@ DoubleVectorRefToken::DoubleVectorRefToken( size_t nRefRowSize, bool bStartFixed, bool bEndFixed ) : FormulaToken(svDoubleVectorRef, ocPush), maArrays(rArrays), mnRequestedLength(nReqLength), mnArrayLength(nArrayLength), - mnRefRowSize(nRefRowSize), mbStartFixed(bStartFixed), mbEndFixed(bEndFixed) {} + mnRefRowSize(nRefRowSize), mbStartFixed(bStartFixed), mbEndFixed(bEndFixed) +{ + SAL_INFO("formula.core", "Created DoubleVectorRefToken nReqLength=" << nReqLength << " nArrayLength=" << nArrayLength); +} FormulaToken* DoubleVectorRefToken::Clone() const { commit 0ab2973f84234dccf9cc22ffd179039065e97df0 Author: Tor Lillqvist <t...@collabora.com> Date: Thu Mar 5 18:03:27 2015 +0200 Add VAR, CORREL, COVAR, PEARSON and SLOPE to the OpenCL default opcode subset Having these statistical functions perform well is essential in many cases, and their implementations seem to be correct. Change-Id: I30afa096295cc163f8c0146e916a77aa411dd07b diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs index 5966b0b..679e868 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs @@ -1373,7 +1373,7 @@ true, and a formula contains only these operators and functions, it might be calculated using OpenCL.</desc> </info> - <value>+;-;*;/;RAND;SIN;COS;TAN;ATAN;EXP;LN;SQRT;NORMSINV;ROUND;POWER;SUMPRODUCT;MIN;MAX;SUM;PRODUCT;AVERAGE;COUNT;NORMDIST;SUMIFS</value> + <value>+;-;*;/;RAND;SIN;COS;TAN;ATAN;EXP;LN;SQRT;NORMSINV;ROUND;POWER;SUMPRODUCT;MIN;MAX;SUM;PRODUCT;AVERAGE;COUNT;VAR;NORMDIST;CORREL;COVAR;PEARSON;SLOPE;SUMIFS</value> </prop> <prop oor:name="OpenCLAutoSelect" oor:type="xs:boolean" oor:nillable="false"> <!-- UIHints: Tools - Options Spreadsheet Formula --> diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx index f152408..7a108f5 100644 --- a/sc/source/core/tool/calcconfig.cxx +++ b/sc/source/core/tool/calcconfig.cxx @@ -63,7 +63,12 @@ void ScCalcConfig::setOpenCLConfigToDefault() maOpenCLSubsetOpCodes.insert(ocProduct); maOpenCLSubsetOpCodes.insert(ocAverage); maOpenCLSubsetOpCodes.insert(ocCount); + maOpenCLSubsetOpCodes.insert(ocVar); maOpenCLSubsetOpCodes.insert(ocNormDist); + maOpenCLSubsetOpCodes.insert(ocCorrel); + maOpenCLSubsetOpCodes.insert(ocCovar); + maOpenCLSubsetOpCodes.insert(ocPearson); + maOpenCLSubsetOpCodes.insert(ocSlope); maOpenCLSubsetOpCodes.insert(ocSumIfs); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits