resolved fdo#79978 propagate error through DoubleArray of matrix
Regression introduced with 83f77ab066
.
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
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user