diff options
author | Winfried Donkers <winfrieddonkers@libreoffice.org> | 2016-12-31 10:05:46 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-01-03 21:10:10 +0000 |
commit | facb4e69e4c75839df89969206403d2e97146dbd (patch) | |
tree | acceb6163336f553936c63e621a78ab06608bfaf | |
parent | 090a2719e293d5b8ec817160897800d1db16574a (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>
-rw-r--r-- | sc/source/core/tool/interpr3.cxx | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx index 205e1aae708a..c0ac545df0f5 100644 --- a/sc/source/core/tool/interpr3.cxx +++ b/sc/source/core/tool/interpr3.cxx @@ -3498,6 +3498,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 ); @@ -3517,8 +3522,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 ); } |