summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorWinfried Donkers <winfrieddonkers@libreoffice.org>2017-09-08 16:44:22 +0200
committerEike Rathke <erack@redhat.com>2017-09-13 18:42:04 +0200
commit65ea925d173db0f319a8ca78855587d089e5270d (patch)
tree24da4b28392e164f774fb9ac6918a68325336a8d /sc
parent23332fd6505cfa4784d131f7b45e68e4dab236f1 (diff)
tdf#109096 Allow 0 as argument value(s) to GEOMEAN()
Both ODFF1.2 and the mathematical definition allow 0 as value(s). Excel does not allow 0 as argument value(s), but IMHO this is to be regarded as an aberration of Excel. Also added tests for no arguments or negative arguments, which is not allowed by ODFF1.2. Change-Id: I330206b6e817e0ec092fe19f713b044578da41d1 Reviewed-on: https://gerrit.libreoffice.org/42107 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/data/functions/statistical/fods/geomean.fods83
-rw-r--r--sc/source/core/tool/interpr3.cxx50
2 files changed, 124 insertions, 9 deletions
diff --git a/sc/qa/unit/data/functions/statistical/fods/geomean.fods b/sc/qa/unit/data/functions/statistical/fods/geomean.fods
index 76b0257f9cd7..2a8fdf3fdf1e 100644
--- a/sc/qa/unit/data/functions/statistical/fods/geomean.fods
+++ b/sc/qa/unit/data/functions/statistical/fods/geomean.fods
@@ -3547,13 +3547,13 @@
<table:table-cell table:number-columns-repeated="6"/>
</table:table-row>
<table:table-row table:style-name="ro7">
- <table:table-cell table:style-name="ce10" table:formula="of:=GEOMEAN([.I1:.I4])" office:value-type="string" office:string-value="" calcext:value-type="error">
- <text:p>Err:502</text:p>
- </table:table-cell>
- <table:table-cell office:value-type="string" calcext:value-type="string">
- <text:p>Err:502</text:p>
+ <table:table-cell table:style-name="ce10" table:formula="of:=GEOMEAN([.I1:.I4])" office:value-type="float" office:value="0" calcext:value-type="float">
+ <text:p>0</text:p>
</table:table-cell>
- <table:table-cell table:style-name="ce15" table:formula="of:=ISERROR([.A2])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
+ <table:table-cell table:style-name="ce10" office:value-type="float" office:value="0" calcext:value-type="float">
+ <text:p>0</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce15" table:formula="of:=ROUND([.A2];12)=ROUND([.B2];12)" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
<text:p>TRUE</text:p>
</table:table-cell>
<table:table-cell table:style-name="ce21" table:formula="of:=FORMULA([.A2])" office:value-type="string" office:string-value="=GEOMEAN(I1:I4)" calcext:value-type="string">
@@ -3699,7 +3699,10 @@
<table:table-cell office:value-type="float" office:value="0.5" calcext:value-type="float">
<text:p>0.5</text:p>
</table:table-cell>
- <table:table-cell table:style-name="ce10" table:number-columns-repeated="2"/>
+ <table:table-cell table:style-name="ce10" office:value-type="float" office:value="-9" calcext:value-type="float">
+ <text:p>-9</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce10"/>
<table:table-cell table:number-columns-repeated="3"/>
<table:table-cell table:style-name="Gnumeric-default"/>
<table:table-cell table:style-name="ce29"/>
@@ -4558,6 +4561,40 @@
<table:table-cell table:style-name="ce21" table:formula="of:=FORMULA([.A37])" office:value-type="string" office:string-value="=GEOMEAN(J2:K5)" calcext:value-type="string">
<text:p>=GEOMEAN(J2:K5)</text:p>
</table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro7">
+ <table:table-cell table:style-name="ce10" table:formula="of:=GEOMEAN([.J21:.J25])" office:value-type="string" office:string-value="" calcext:value-type="error">
+ <text:p>#NUM!</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>#NUM!</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce59" table:formula="of:=ISERROR([.A38])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
+ <text:p>TRUE</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce21" table:formula="of:=FORMULA([.A38])" office:value-type="string" office:string-value="=GEOMEAN(J21:J25)" calcext:value-type="string">
+ <text:p>=GEOMEAN(J21:J25)</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>at least 1 value must be given</text:p>
+ </table:table-cell>
+ </table:table-row>
+ <table:table-row table:style-name="ro7">
+ <table:table-cell table:formula="of:=GEOMEAN()" office:value-type="string" office:string-value="" calcext:value-type="error">
+ <text:p>#NUM!</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>#NUM!</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce60" table:formula="of:=ISERROR([.A39])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
+ <text:p>TRUE</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce21" table:formula="of:=FORMULA([.A39])" office:value-type="string" office:string-value="=GEOMEAN()" calcext:value-type="string">
+ <text:p>=GEOMEAN()</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>at least 1 value must be given</text:p>
+ </table:table-cell>
<table:table-cell table:number-columns-repeated="17"/>
<table:table-cell table:style-name="ce32"/>
<table:table-cell table:style-name="ce34"/>
@@ -4568,9 +4605,37 @@
<table:table-cell table:style-name="ce25" table:number-columns-repeated="2"/>
<table:table-cell table:number-columns-repeated="2"/>
<table:table-cell table:style-name="ce35"/>
+ <table:table-cell table:number-columns-repeated="2"/>
+ </table:table-row>
+ <table:table-row table:style-name="ro7">
+ <table:table-cell table:formula="of:=GEOMEAN([.J2:.J6])" office:value-type="string" office:string-value="" calcext:value-type="error">
+ <text:p>Err:502</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>Err:502</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce61" table:formula="of:=ISERROR([.A40])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
+ <text:p>TRUE</text:p>
+ </table:table-cell>
+ <table:table-cell table:style-name="ce21" table:formula="of:=FORMULA([.A40])" office:value-type="string" office:string-value="=GEOMEAN(J2:J6)" calcext:value-type="string">
+ <text:p>=GEOMEAN(J2:J6)</text:p>
+ </table:table-cell>
+ <table:table-cell office:value-type="string" calcext:value-type="string">
+ <text:p>negative values are not allowed</text:p>
+ </table:table-cell>
+ <table:table-cell table:number-columns-repeated="16"/>
+ <table:table-cell table:style-name="ce32"/>
+ <table:table-cell table:style-name="ce34"/>
+ <table:table-cell table:style-name="ce25"/>
+ <table:table-cell/>
+ <table:table-cell table:style-name="ce25"/>
+ <table:table-cell/>
+ <table:table-cell table:style-name="ce25" table:number-columns-repeated="2"/>
+ <table:table-cell table:number-columns-repeated="2"/>
+ <table:table-cell table:style-name="ce35"/>
<table:table-cell table:number-columns-repeated="3"/>
</table:table-row>
- <table:table-row table:style-name="ro7" table:number-rows-repeated="4">
+ <table:table-row table:style-name="ro7" table:number-rows-repeated="3">
<table:table-cell table:number-columns-repeated="2"/>
<table:table-cell table:style-name="ce17"/>
<table:table-cell table:style-name="ce21"/>
@@ -5186,4 +5251,4 @@
</table:named-expressions>
</office:spreadsheet>
</office:body>
-</office:document> \ No newline at end of file
+</office:document>
diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx
index 7b60e39dc6f4..e6ae4c2649d8 100644
--- a/sc/source/core/tool/interpr3.cxx
+++ b/sc/source/core/tool/interpr3.cxx
@@ -3042,6 +3042,14 @@ void ScInterpreter::ScGeoMean()
nVal += log(x);
nValCount++;
}
+ else if ( x == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
break;
@@ -3058,6 +3066,14 @@ void ScInterpreter::ScGeoMean()
nVal += log(x);
nValCount++;
}
+ else if ( x == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
}
@@ -3077,6 +3093,14 @@ void ScInterpreter::ScGeoMean()
nVal += log(nCellVal);
nValCount++;
}
+ else if ( nCellVal == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
SetError(nErr);
@@ -3087,6 +3111,14 @@ void ScInterpreter::ScGeoMean()
nVal += log(nCellVal);
nValCount++;
}
+ else if ( nCellVal == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
}
@@ -3112,6 +3144,14 @@ void ScInterpreter::ScGeoMean()
nVal += log(x);
nValCount++;
}
+ else if ( x == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
}
@@ -3119,6 +3159,7 @@ void ScInterpreter::ScGeoMean()
else
{
for (SCSIZE ui = 0; ui < nCount; ui++)
+ {
if (!pMat->IsString(ui))
{
double x = pMat->GetDouble(ui);
@@ -3127,9 +3168,18 @@ void ScInterpreter::ScGeoMean()
nVal += log(x);
nValCount++;
}
+ else if ( x == 0.0 )
+ {
+ // value of 0 means that function result will be 0
+ while ( nParamCount-- > 0 )
+ PopError();
+ PushDouble( 0.0 );
+ return;
+ }
else
SetError( FormulaError::IllegalArgument);
}
+ }
}
}
}