summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWinfried Donkers <winfrieddonkers@libreoffice.org>2016-12-31 10:05:46 +0100
committerEike Rathke <erack@redhat.com>2017-01-04 11:12:41 +0000
commit1aa34bf14e86f3b684c56a9db8ebf1307413df5d (patch)
treee08848f2a520e6df9beaa965e2a13095b307448a
parentf7eeb3fc1dc5d072dbfd22b68cc51f3a2c8ef8b0 (diff)
tdf#104981 Fix deficiencies with PERCENTRANK functions.
Added constraint check for significance argument. Replced inproper use of log() with log10(). Improved code efficiency a little bit. Change-Id: Ie918857e6a04ea9fcf18410f789d7252f9c1cfc8 Reviewed-on: https://gerrit.libreoffice.org/32528 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com> (cherry picked from commit facb4e69e4c75839df89969206403d2e97146dbd) Reviewed-on: https://gerrit.libreoffice.org/32703
-rw-r--r--sc/source/core/tool/interpr3.cxx9
1 files changed, 7 insertions, 2 deletions
diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx
index 5e7302203e7c..c9e145d46d06 100644
--- a/sc/source/core/tool/interpr3.cxx
+++ b/sc/source/core/tool/interpr3.cxx
@@ -3508,6 +3508,11 @@ void ScInterpreter::ScPercentrank( bool bInclusive )
if ( !MustHaveParamCount( nParamCount, 2, 3 ) )
return;
double fSignificance = ( nParamCount == 3 ? ::rtl::math::approxFloor( GetDouble() ) : 3.0 );
+ if ( fSignificance < 1.0 )
+ {
+ PushIllegalArgument();
+ return;
+ }
double fNum = GetDouble();
vector<double> aSortArray;
GetSortArray( 1, aSortArray, nullptr, false, false );
@@ -3527,8 +3532,8 @@ void ScInterpreter::ScPercentrank( bool bInclusive )
fRes = GetPercentrank( aSortArray, fNum, bInclusive );
if ( fRes != 0.0 )
{
- double fExp = ::rtl::math::approxFloor( log( fRes ) );
- fRes = ::rtl::math::round( fRes * pow( 10, -fExp + fSignificance - 1 ) ) / pow( 10, -fExp + fSignificance - 1 );
+ double fExp = ::rtl::math::approxFloor( log10( fRes ) ) + 1.0 - fSignificance;
+ fRes = ::rtl::math::round( fRes * pow( 10, -fExp ) ) / pow( 10, -fExp );
}
PushDouble( fRes );
}