From 1aa34bf14e86f3b684c56a9db8ebf1307413df5d Mon Sep 17 00:00:00 2001 From: Winfried Donkers Date: Sat, 31 Dec 2016 10:05:46 +0100 Subject: 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 Reviewed-by: Eike Rathke (cherry picked from commit facb4e69e4c75839df89969206403d2e97146dbd) Reviewed-on: https://gerrit.libreoffice.org/32703 --- sc/source/core/tool/interpr3.cxx | 9 +++++++-- 1 file 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 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 ); } -- cgit