--- oo_1.1_src.orig/sc/source/core/tool/interpr3.cxx 2003-05-13 13:33:04.000000000 +0100 +++ oo_1.1_src/sc/source/core/tool/interpr3.cxx 2003-11-25 22:08:11.000000000 +0000 @@ -1855,12 +1855,12 @@ BYTE nParamCount = GetByte(); if ( !MustHaveParamCountMin( nParamCount, 1 ) ) return; - USHORT SaveSP = sp; USHORT i; double fSum = 0.0; - double fSumSqr = 0.0; + double vSum = 0.0; + std::vector values; double fCount = 0.0; - double fVal; + double fVal = 0.0; ScAddress aAdr; ScRange aRange; for (i = 0; i < nParamCount; i++) @@ -1871,7 +1871,7 @@ { fVal = GetDouble(); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } break; @@ -1883,7 +1883,7 @@ { fVal = GetCellValue( aAdr, pCell ); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -1896,13 +1896,13 @@ if (aValIter.GetFirst(fVal, nErr)) { fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; SetError(nErr); while ((nErr == 0) && aValIter.GetNext(fVal, nErr)) { fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } SetError(nErr); @@ -1921,7 +1921,7 @@ { fVal = pMat->GetDouble(i); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -1932,7 +1932,7 @@ { fVal = pMat->GetDouble(i); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -1944,72 +1944,36 @@ break; } } + if (nGlobalError) { PushInt(0); return; } + double fMean = fSum / fCount; - double fSSqr = (fSumSqr - fSum*fSum/fCount)/(fCount-1.0); - sp = SaveSP; - fSum = 0.0; - // #55733# GCC Optimierungsfehler, GPF wenn die 4.0 als Konstante an pow() - // uebergeben wird, auch ein "const double fPow = 4.0;" GPF't, - double fPow = 4.0; - for (i = 0; i < nParamCount; i++) - { - switch (GetStackType()) - { - case svDouble : - fSum += pow(GetDouble()-fMean,fPow); - break; - case svSingleRef : - { - PopSingleRef( aAdr ); - ScBaseCell* pCell = GetCell( aAdr ); - if (HasCellValueData(pCell)) - fSum += pow(GetCellValue( aAdr, pCell ) - fMean, fPow); - } - break; - case svDoubleRef : - { - PopDoubleRef( aRange ); - USHORT nErr = 0; - ScValueIterator aValIter(pDok, aRange); - if (aValIter.GetFirst(fVal, nErr)) - { - fSum += pow(fVal - fMean, fPow); - while (aValIter.GetNext(fVal, nErr)) - fSum += pow(fVal - fMean, fPow); - } - } - break; - case svMatrix : - { - ScMatrix* pMat = PopMatrix(); - if (pMat) - { - ULONG nCount = pMat->GetElementCount(); - if (pMat->IsNumeric()) - { - for (ULONG i = 0; i < nCount; i++) - fSum += pow(pMat->GetDouble(i) - fMean, fPow); - } - else - { - for (ULONG i = 0; i < nCount; i++) - if (!pMat->IsString(i)) - fSum += pow(pMat->GetDouble(i) - fMean, fPow); - } - } - } - break; - default : SetError(errIllegalParameter); break; - } - } - PushDouble(fCount*(fCount+1.0)/((fCount-1.0)*(fCount-2.0)*(fCount-3.0)) - *fSum/(fSSqr*fSSqr) - - 3.0*(fCount-1.0)*(fCount-1.0)/((fCount-2.0)*(fCount-3.0))); + + for (i = 0; i < values.size(); i++) + vSum += (values[i] - fMean) * (values[i] - fMean); + + double fStdDev = sqrt(vSum / (fCount - 1.0)); + double dx = 0.0; + double xpower4 = 0.0; + + if (fStdDev == 0) + return; + + for (i = 0; i < values.size(); i++) + { + dx = (values[i] - fMean) / fStdDev; + xpower4 = xpower4 + (dx * dx * dx * dx); + } + + double k_d = (fCount - 2.0) * (fCount - 3.0); + double k_l = fCount * (fCount + 1.0) / ((fCount - 1.0) * k_d); + double k_t = 3.0 * (fCount - 1.0) * (fCount - 1.0) / k_d; + + PushDouble(xpower4 * k_l - k_t); } void ScInterpreter::ScHarMean() @@ -2261,12 +2225,12 @@ BYTE nParamCount = GetByte(); if ( !MustHaveParamCountMin( nParamCount, 1 ) ) return; - USHORT SaveSP = sp; USHORT i; double fSum = 0.0; - double fSumSqr = 0.0; + double vSum = 0.0; + std::vector values; double fCount = 0.0; - double fVal; + double fVal = 0.0; ScAddress aAdr; ScRange aRange; for (i = 0; i < nParamCount; i++) @@ -2277,7 +2241,7 @@ { fVal = GetDouble(); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } break; @@ -2289,7 +2253,7 @@ { fVal = GetCellValue( aAdr, pCell ); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -2302,13 +2266,13 @@ if (aValIter.GetFirst(fVal, nErr)) { fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; SetError(nErr); while ((nErr == 0) && aValIter.GetNext(fVal, nErr)) { fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } SetError(nErr); @@ -2327,7 +2291,7 @@ { fVal = pMat->GetDouble(i); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -2338,7 +2302,7 @@ { fVal = pMat->GetDouble(i); fSum += fVal; - fSumSqr += fVal*fVal; + values.push_back(fVal); fCount++; } } @@ -2350,68 +2314,32 @@ break; } } + if (nGlobalError) { PushInt(0); return; } + double fMean = fSum / fCount; - double fSSqr = (fSumSqr - fSum*fSum/fCount)/(fCount-1.0); - sp = SaveSP; - fSum = 0.0; - double fPow = 3.0; // vorsichtshalber wg. #55733#, siehe ScKurt() - for (i = 0; i < nParamCount; i++) + + for (i = 0; i < values.size(); i++) + vSum += (values[i] - fMean) * (values[i] - fMean); + + double fStdDev = sqrt(vSum / (fCount - 1.0)); + double dx = 0.0; + double xcube = 0.0; + + if (fStdDev == 0) + return; + + for (i = 0; i < values.size(); i++) { - switch (GetStackType()) - { - case svDouble : - fSum += pow(GetDouble()-fMean,fPow); - break; - case svSingleRef : - { - PopSingleRef( aAdr ); - ScBaseCell* pCell = GetCell( aAdr ); - if (HasCellValueData(pCell)) - fSum += pow(GetCellValue( aAdr, pCell ) - fMean, fPow); - } - break; - case svDoubleRef : - { - PopDoubleRef( aRange ); - USHORT nErr = 0; - ScValueIterator aValIter(pDok, aRange); - if (aValIter.GetFirst(fVal, nErr)) - { - fSum += pow(fVal - fMean, fPow); - while (aValIter.GetNext(fVal, nErr)) - fSum += pow(fVal - fMean, fPow); - } - } - break; - case svMatrix : - { - ScMatrix* pMat = PopMatrix(); - if (pMat) - { - ULONG nCount = pMat->GetElementCount(); - if (pMat->IsNumeric()) - { - for (ULONG i = 0; i < nCount; i++) - fSum += pow(pMat->GetDouble(i) - fMean, fPow); - } - else - { - for (ULONG i = 0; i < nCount; i++) - if (!pMat->IsString(i)) - fSum += pow(pMat->GetDouble(i) - fMean, fPow); - } - } - } - break; - default : SetError(errIllegalParameter); break; - } + dx = (values[i] - fMean) / fStdDev; + xcube = xcube + (dx * dx * dx); } - PushDouble(fCount/((fCount-1.0)*(fCount-2.0))*fSum/(fSSqr*sqrt(fSSqr))); + + PushDouble(((xcube * fCount) / (fCount - 1.0)) / (fCount - 2.0)); } void ScInterpreter::ScMedian()