Hallo, I made a mistake, to commit before testing. Therefore are 2 patch-files. Please, can anybody test this extension.
Greetings Wolfgang
>From 18dddf4faa96a12e254e3f5c0fe4c8451a61601c Mon Sep 17 00:00:00 2001 From: Wolfgang Pechlaner <l...@pechlaner.at> Date: Wed, 21 Sep 2011 19:30:41 +0200 Subject: [PATCH 1/2] fdo# 40835, 4th parameter for FDIST --- sc/source/core/inc/interpre.hxx | 1 + sc/source/core/tool/interpr3.cxx | 24 +++++++++++++++++++++--- sc/source/ui/src/scfuncs.src | 10 +++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index a693f58..5dbbb94 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -716,6 +716,7 @@ double GetChiDist(double fChi, double fDF); // for LEGACY.CHIDIST, returns r double GetChiSqDistCDF(double fX, double fDF); // for CHISQDIST, returns left tail double GetChiSqDistPDF(double fX, double fDF); // probability density function double GetFDist(double x, double fF1, double fF2); +double GetFDistPDF(double x, double fF1, double fF2); double GetTDist(double T, double fDF); double Fakultaet(double x); double BinomKoeff(double n, double k); diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx index 728faea..beca279 100644 --- a/sc/source/core/tool/interpr3.cxx +++ b/sc/source/core/tool/interpr3.cxx @@ -645,13 +645,22 @@ double ScInterpreter::GetLogGamma(double fZ) double ScInterpreter::GetFDist(double x, double fF1, double fF2) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDist" ); + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDistPDF" ); double arg = fF2/(fF2+fF1*x); double alpha = fF2/2.0; double beta = fF1/2.0; return (GetBetaDist(arg, alpha, beta)); } +double ScInterpreter::GetFDistPDF(double x, double fF1, double fF2) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDistPDF" ); + double arg = fF2/(fF2+fF1*x); + double alpha = fF2/2.0; + double beta = fF1/2.0; + return (GetBetaDistPDF(arg, alpha, beta)); +} + double ScInterpreter::GetTDist(double T, double fDF) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetTDist" ); @@ -1558,8 +1567,10 @@ void ScInterpreter::ScTDist() void ScInterpreter::ScFDist() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScFDist" ); - if ( !MustHaveParamCount( GetByte(), 3 ) ) + sal_uInt8 nParamCount = GetByte(); + if ( !MustHaveParamCount( nParamCount, 3, 4)) return; + bool bCumulative = nParamCount == 4 ? GetBool() : true; double fF2 = ::rtl::math::approxFloor(GetDouble()); double fF1 = ::rtl::math::approxFloor(GetDouble()); double fF = GetDouble(); @@ -1568,7 +1579,14 @@ void ScInterpreter::ScFDist() PushIllegalArgument(); return; } - PushDouble(GetFDist(fF, fF1, fF2)); + if (bCumulative) + { + PushDouble(GetFDist(fF, fF1, fF2)); + } + else + { + PushDouble(GetFDistPDF(fF, fF1, fF2)); + } } void ScInterpreter::ScChiDist() diff --git a/sc/source/ui/src/scfuncs.src b/sc/source/ui/src/scfuncs.src index 8f8bb04..d4e781d 100644 --- a/sc/source/ui/src/scfuncs.src +++ b/sc/source/ui/src/scfuncs.src @@ -6406,7 +6406,7 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS2 0; ID_FUNCTION_GRP_STATISTIC; U2S( HID_FUNC_FVERT ); - 3; 0; 0; 0; + 4; 0; 0; 0; 1; 0; }; String 2 // Name of Parameter 1 @@ -6433,6 +6433,14 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS2 { Text [ en-US ] = "The degrees of freedom in the denominator of the F distribution." ; }; + String 8 // Name of Parameter 4 + { + Text [en-US ] = "Cumulative" ; + }; + String 9 // Description of Parameter 4 + { + Text [ en-US ] = "0 or FALSE for probability density function, any other value or TRUE or omitted for cumulative distribution function."; + }; }; // -=*# Resource for function FINV #*=- Resource SC_OPCODE_F_INV -- 1.7.3.4
>From 9bc05a400c28981786cd2282f546cee87115c7cc Mon Sep 17 00:00:00 2001 From: Wolfgang Pechlaner <l...@pechlaner.at> Date: Sat, 24 Sep 2011 21:31:20 +0200 Subject: [PATCH 2/2] fdo# 40835, 4th parameter for FDIST --- sc/source/core/tool/interpr3.cxx | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx index beca279..adcc7a9 100644 --- a/sc/source/core/tool/interpr3.cxx +++ b/sc/source/core/tool/interpr3.cxx @@ -645,7 +645,7 @@ double ScInterpreter::GetLogGamma(double fZ) double ScInterpreter::GetFDist(double x, double fF1, double fF2) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDistPDF" ); + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDist" ); double arg = fF2/(fF2+fF1*x); double alpha = fF2/2.0; double beta = fF1/2.0; @@ -655,10 +655,13 @@ double ScInterpreter::GetFDist(double x, double fF1, double fF2) double ScInterpreter::GetFDistPDF(double x, double fF1, double fF2) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::GetFDistPDF" ); - double arg = fF2/(fF2+fF1*x); - double alpha = fF2/2.0; - double beta = fF1/2.0; - return (GetBetaDistPDF(arg, alpha, beta)); + if (x == 0 && fF1 == 1) + { + SetError(errIllegalArgument); + return HUGE_VAL; + } + double prefix = (1.0 /GetBeta(fF1 / 2.0, fF2 / 2.0)) * pow(fF1 / fF2, fF1/2); + return prefix * pow(x, fF1/2 -1) / pow(1.0 + fF1/fF2 * x, (fF1 + fF2) / 2); } double ScInterpreter::GetTDist(double T, double fDF) -- 1.7.3.4
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice