Kaydet (Commit) a288bebb authored tarafından Eike Rathke's avatar Eike Rathke

resolved fdo#79978 propagate error through DoubleArray of matrix

Regression introduced with 83f77ab0.

Interpreter errors are transported using NaN coded doubles, using simple
setNan()/isNan() to flag and ignore non-numeric values skips all error
values.

Change-Id: I0d3cb30262bc5ba7ee77e53a2bc45e56569fbc4b
üst c9d037e5
......@@ -74,6 +74,10 @@ const sal_uInt16 errNotNumericString = 534;
// ScInterpreter internal: jump matrix already has a result at this position,
// do not overwrite in case of empty code path.
const sal_uInt16 errJumpMatHasResult = 535;
// ScInterpreter internal: (matrix) element is not a numeric value, i.e.
// string or empty, to be distinguished from the general errNoValue NAN and not
// to be used as result.
const sal_uInt16 errElementNaN = 536;
// Interpreter: NA() not available condition, not a real error
const sal_uInt16 NOTAVAILABLE = 0x7fff;
......
......@@ -5613,7 +5613,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc )
continue;
fVal = *itMain;
if (rtl::math::isNan(fVal))
if (GetDoubleErrorValue(fVal) == errElementNaN)
continue;
++fCount;
......
......@@ -1657,13 +1657,25 @@ namespace {
class SumValues : std::unary_function<double, void>
{
double mfSum;
bool mbError;
public:
SumValues() : mfSum(0.0) {}
SumValues() : mfSum(0.0), mbError(false) {}
void operator() (double f)
{
if (!rtl::math::isNan(f))
if (mbError)
return;
sal_uInt16 nErr = GetDoubleErrorValue(f);
if (!nErr)
mfSum += f;
else if (nErr != errElementNaN)
{
// Propagate the first error encountered, ignore "this is not a
// number" elements.
mfSum = f;
mbError = true;
}
}
double getValue() const { return mfSum; }
......
......@@ -1507,7 +1507,7 @@ public:
ToDoubleArray( size_t nSize, bool bEmptyAsZero ) :
maArray(nSize, 0.0), miPos(maArray.begin()), mbEmptyAsZero(bEmptyAsZero)
{
rtl::math::setNan(&mfNaN);
mfNaN = CreateDoubleError( errElementNaN);
}
void operator() (const MatrixImplType::element_block_node_type& node)
......@@ -1578,7 +1578,7 @@ class MergeDoubleArrayFunc : std::unary_function<MatrixImplType::element_block_t
public:
MergeDoubleArrayFunc(std::vector<double>& rArray) : mrArray(rArray), miPos(mrArray.begin())
{
rtl::math::setNan(&mfNaN);
mfNaN = CreateDoubleError( errElementNaN);
}
void operator() (const MatrixImplType::element_block_node_type& node)
......@@ -1594,7 +1594,7 @@ public:
numeric_element_block::const_iterator itEnd = numeric_element_block::end(*node.data);
for (; it != itEnd; ++it, ++miPos)
{
if (rtl::math::isNan(*miPos))
if (GetDoubleErrorValue(*miPos) == errElementNaN)
continue;
*miPos = op(*miPos, *it);
......@@ -1607,7 +1607,7 @@ public:
boolean_element_block::const_iterator itEnd = boolean_element_block::end(*node.data);
for (; it != itEnd; ++it, ++miPos)
{
if (rtl::math::isNan(*miPos))
if (GetDoubleErrorValue(*miPos) == errElementNaN)
continue;
*miPos = op(*miPos, *it ? 1.0 : 0.0);
......@@ -1625,7 +1625,7 @@ public:
// Empty element is equivalent of having a numeric value of 0.0.
for (size_t i = 0; i < node.size; ++i, ++miPos)
{
if (rtl::math::isNan(*miPos))
if (GetDoubleErrorValue(*miPos) == errElementNaN)
continue;
*miPos = op(*miPos, 0.0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment