diff options
Diffstat (limited to 'sc/source/core')
-rw-r--r-- | sc/source/core/tool/interpr3.cxx | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/sc/source/core/tool/interpr3.cxx b/sc/source/core/tool/interpr3.cxx index 17fe63381362..c339a68dd80f 100644 --- a/sc/source/core/tool/interpr3.cxx +++ b/sc/source/core/tool/interpr3.cxx @@ -84,32 +84,36 @@ static double lcl_IterateInverse( const ScDistFunc& rFunction, double fAx, doubl // find enclosing interval + KahanSum fkAx = fAx; + KahanSum fkBx = fBx; double fAy = rFunction.GetValue(fAx); double fBy = rFunction.GetValue(fBx); - double fTemp; + KahanSum fTemp; unsigned short nCount; for (nCount = 0; nCount < 1000 && !lcl_HasChangeOfSign(fAy,fBy); nCount++) { if (std::abs(fAy) <= std::abs(fBy)) { - fTemp = fAx; - fAx += 2.0 * (fAx - fBx); - if (fAx < 0.0) - fAx = 0.0; - fBx = fTemp; + fTemp = fkAx; + fkAx += (fkAx - fkBx) * 2.0; + if (fkAx < 0.0) + fkAx = 0.0; + fkBx = fTemp; fBy = fAy; - fAy = rFunction.GetValue(fAx); + fAy = rFunction.GetValue(fkAx.get()); } else { - fTemp = fBx; - fBx += 2.0 * (fBx - fAx); - fAx = fTemp; + fTemp = fkBx; + fkBx += (fkBx - fkAx) * 2.0; + fkAx = fTemp; fAy = fBy; - fBy = rFunction.GetValue(fBx); + fBy = rFunction.GetValue(fkBx.get()); } } + fAx = fkAx.get(); + fBx = fkBx.get(); if (fAy == 0.0) return fAx; if (fBy == 0.0) |