[Libreoffice-commits] core.git: sc/qa sc/source

dante (via logerrit) logerrit at kemper.freedesktop.org
Mon May 3 11:54:37 UTC 2021


 sc/qa/unit/data/functions/statistical/fods/forecast.fods |   10 +-
 sc/source/core/tool/interpr3.cxx                         |   70 +++++++--------
 2 files changed, 38 insertions(+), 42 deletions(-)

New commits:
commit 040451e19087d8cb8ff4376166ca8248f909a4e0
Author:     dante <dante19031999 at gmail.com>
AuthorDate: Sat May 1 10:41:43 2021 +0200
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Mon May 3 13:53:58 2021 +0200

    tdf#137679 Use Kahan summation for interpr3.cxx (1/2)
    
    Change-Id: I8b07af0ad71f2be5acc8a660b93a48b9db6728f9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114964
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/sc/qa/unit/data/functions/statistical/fods/forecast.fods b/sc/qa/unit/data/functions/statistical/fods/forecast.fods
index 2ec105af4d80..aafec26860b6 100644
--- a/sc/qa/unit/data/functions/statistical/fods/forecast.fods
+++ b/sc/qa/unit/data/functions/statistical/fods/forecast.fods
@@ -4197,11 +4197,11 @@
      <table:table-cell table:style-name="ce33"/>
     </table:table-row>
     <table:table-row table:style-name="ro7">
-     <table:table-cell office:value-type="float" office:value="129.554682838848" calcext:value-type="float">
-      <text:p>129.554682838848</text:p>
+     <table:table-cell office:value-type="float" office:value="129.554682838849" calcext:value-type="float">
+      <text:p>129.554682838849</text:p>
      </table:table-cell>
-     <table:table-cell office:value-type="float" office:value="129.554682838848" calcext:value-type="float">
-      <text:p>129.554682838848</text:p>
+     <table:table-cell office:value-type="float" office:value="129.554682838849" calcext:value-type="float">
+      <text:p>129.554682838849</text:p>
      </table:table-cell>
      <table:table-cell table:style-name="ce16" table:formula="of:=ROUND([.A34];12)=ROUND([.B34];12)" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
       <text:p>TRUE</text:p>
@@ -4950,4 +4950,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 193a9ca4b553..d0cd61c0a228 100644
--- a/sc/source/core/tool/interpr3.cxx
+++ b/sc/source/core/tool/interpr3.cxx
@@ -2915,7 +2915,7 @@ void ScInterpreter::ScKurt()
 void ScInterpreter::ScHarMean()
 {
     short nParamCount = GetByte();
-    double nVal = 0.0;
+    KahanSum nVal = 0.0;
     double nValCount = 0.0;
     ScAddress aAdr;
     ScRange aRange;
@@ -3028,7 +3028,7 @@ void ScInterpreter::ScHarMean()
         }
     }
     if (nGlobalError == FormulaError::NONE)
-        PushDouble( nValCount / nVal );
+        PushDouble( nValCount / nVal.get() );
     else
         PushError( nGlobalError);
 }
@@ -3036,7 +3036,7 @@ void ScInterpreter::ScHarMean()
 void ScInterpreter::ScGeoMean()
 {
     short nParamCount = GetByte();
-    double nVal = 0.0;
+    KahanSum nVal = 0.0;
     double nValCount = 0.0;
     ScAddress aAdr;
     ScRange aRange;
@@ -3200,7 +3200,7 @@ void ScInterpreter::ScGeoMean()
         }
     }
     if (nGlobalError == FormulaError::NONE)
-        PushDouble(exp(nVal / nValCount));
+        PushDouble(exp(nVal.get() / nValCount));
     else
         PushError( nGlobalError);
 }
@@ -3846,10 +3846,10 @@ void ScInterpreter::ScTrimMean()
             nIndex--;
         nIndex /= 2;
         OSL_ENSURE(nIndex < nSize, "ScTrimMean: wrong index");
-        double fSum = 0.0;
+        KahanSum fSum = 0.0;
         for (SCSIZE i = nIndex; i < nSize-nIndex; i++)
             fSum += aSortArray[i];
-        PushDouble(fSum/static_cast<double>(nSize-2*nIndex));
+        PushDouble(fSum.get()/static_cast<double>(nSize-2*nIndex));
     }
 }
 
@@ -4285,7 +4285,7 @@ void ScInterpreter::ScAveDev()
         return;
     sal_uInt16 SaveSP = sp;
     double nMiddle = 0.0;
-    double rVal = 0.0;
+    KahanSum rVal = 0.0;
     double rValCount = 0.0;
     ScAddress aAdr;
     ScRange aRange;
@@ -4369,7 +4369,7 @@ void ScInterpreter::ScAveDev()
         PushError( nGlobalError);
         return;
     }
-    nMiddle = rVal / rValCount;
+    nMiddle = rVal.get() / rValCount;
     sp = SaveSP;
     rVal = 0.0;
     nParam = nParamCount;
@@ -4398,7 +4398,7 @@ void ScInterpreter::ScAveDev()
                 ScValueIterator aValIter( mrDoc, aRange, mnSubTotalFlags );
                 if (aValIter.GetFirst(nCellVal, nErr))
                 {
-                    rVal += (fabs(nCellVal - nMiddle));
+                    rVal += fabs(nCellVal - nMiddle);
                     while (aValIter.GetNext(nCellVal, nErr))
                          rVal += fabs(nCellVal - nMiddle);
                 }
@@ -4433,7 +4433,7 @@ void ScInterpreter::ScAveDev()
             default : SetError(FormulaError::IllegalParameter); break;
         }
     }
-    PushDouble(rVal / rValCount);
+    PushDouble(rVal.get() / rValCount);
 }
 
 void ScInterpreter::ScDevSq()
@@ -4477,8 +4477,8 @@ void ScInterpreter::ScProbability()
             PushNA();
         else
         {
-            double fSum = 0.0;
-            double fRes = 0.0;
+            KahanSum fSum = 0.0;
+            KahanSum fRes = 0.0;
             bool bStop = false;
             double fP, fW;
             for ( SCSIZE i = 0; i < nC1 && !bStop; i++ )
@@ -4502,10 +4502,10 @@ void ScInterpreter::ScProbability()
                         SetError( FormulaError::IllegalArgument);
                 }
             }
-            if (bStop || fabs(fSum -1.0) > 1.0E-7)
+            if (bStop || std::abs((fSum -1.0).get()) > 1.0E-7)
                 PushNoValue();
             else
-                PushDouble(fRes);
+                PushDouble(fRes.get());
         }
     }
 }
@@ -4667,8 +4667,8 @@ void ScInterpreter::CalculateSlopeIntercept(bool bSlope)
     }
     // #i78250# numerical stability improved
     double fCount           = 0.0;
-    double fSumX            = 0.0;
-    double fSumY            = 0.0;
+    KahanSum fSumX          = 0.0;
+    KahanSum fSumY          = 0.0;
 
     for (SCSIZE i = 0; i < nC1; i++)
     {
@@ -4676,10 +4676,8 @@ void ScInterpreter::CalculateSlopeIntercept(bool bSlope)
         {
             if (!pMat1->IsStringOrEmpty(i,j) && !pMat2->IsStringOrEmpty(i,j))
             {
-                double fValX = pMat1->GetDouble(i,j);
-                double fValY = pMat2->GetDouble(i,j);
-                fSumX += fValX;
-                fSumY += fValY;
+                fSumX += pMat1->GetDouble(i,j);
+                fSumY += pMat2->GetDouble(i,j);
                 fCount++;
             }
         }
@@ -4688,10 +4686,10 @@ void ScInterpreter::CalculateSlopeIntercept(bool bSlope)
         PushNoValue();
     else
     {
-        double fSumDeltaXDeltaY = 0.0; // sum of (ValX-MeanX)*(ValY-MeanY)
-        double fSumSqrDeltaX    = 0.0; // sum of (ValX-MeanX)^2
-        double fMeanX = fSumX / fCount;
-        double fMeanY = fSumY / fCount;
+        KahanSum fSumDeltaXDeltaY = 0.0; // sum of (ValX-MeanX)*(ValY-MeanY)
+        KahanSum fSumSqrDeltaX    = 0.0; // sum of (ValX-MeanX)^2
+        double fMeanX = fSumX.get() / fCount;
+        double fMeanY = fSumY.get() / fCount;
         for (SCSIZE i = 0; i < nC1; i++)
         {
             for (SCSIZE j = 0; j < nR1; j++)
@@ -4710,9 +4708,9 @@ void ScInterpreter::CalculateSlopeIntercept(bool bSlope)
         else
         {
             if ( bSlope )
-                PushDouble( fSumDeltaXDeltaY / fSumSqrDeltaX);
+                PushDouble( fSumDeltaXDeltaY.get() / fSumSqrDeltaX.get());
             else
-                PushDouble( fMeanY - fSumDeltaXDeltaY / fSumSqrDeltaX * fMeanX);
+                PushDouble( fMeanY - fSumDeltaXDeltaY.get() / fSumSqrDeltaX.get() * fMeanX);
         }
     }
 }
@@ -4750,8 +4748,8 @@ void ScInterpreter::ScForecast()
     double fVal = GetDouble();
     // #i78250# numerical stability improved
     double fCount           = 0.0;
-    double fSumX            = 0.0;
-    double fSumY            = 0.0;
+    KahanSum fSumX          = 0.0;
+    KahanSum fSumY          = 0.0;
 
     for (SCSIZE i = 0; i < nC1; i++)
     {
@@ -4759,10 +4757,8 @@ void ScInterpreter::ScForecast()
         {
             if (!pMat1->IsStringOrEmpty(i,j) && !pMat2->IsStringOrEmpty(i,j))
             {
-                double fValX = pMat1->GetDouble(i,j);
-                double fValY = pMat2->GetDouble(i,j);
-                fSumX += fValX;
-                fSumY += fValY;
+                fSumX += pMat1->GetDouble(i,j);
+                fSumY += pMat2->GetDouble(i,j);
                 fCount++;
             }
         }
@@ -4771,10 +4767,10 @@ void ScInterpreter::ScForecast()
         PushNoValue();
     else
     {
-        double fSumDeltaXDeltaY = 0.0; // sum of (ValX-MeanX)*(ValY-MeanY)
-        double fSumSqrDeltaX    = 0.0; // sum of (ValX-MeanX)^2
-        double fMeanX = fSumX / fCount;
-        double fMeanY = fSumY / fCount;
+        KahanSum fSumDeltaXDeltaY = 0.0; // sum of (ValX-MeanX)*(ValY-MeanY)
+        KahanSum fSumSqrDeltaX    = 0.0; // sum of (ValX-MeanX)^2
+        double fMeanX = fSumX.get() / fCount;
+        double fMeanY = fSumY.get() / fCount;
         for (SCSIZE i = 0; i < nC1; i++)
         {
             for (SCSIZE j = 0; j < nR1; j++)
@@ -4791,7 +4787,7 @@ void ScInterpreter::ScForecast()
         if (fSumSqrDeltaX == 0.0)
             PushError( FormulaError::DivisionByZero);
         else
-            PushDouble( fMeanY + fSumDeltaXDeltaY / fSumSqrDeltaX * (fVal - fMeanX));
+            PushDouble( fMeanY + fSumDeltaXDeltaY.get() / fSumSqrDeltaX.get() * (fVal - fMeanX));
     }
 }
 


More information about the Libreoffice-commits mailing list