diff options
author | drh <> | 2023-07-10 18:05:23 +0000 |
---|---|---|
committer | drh <> | 2023-07-10 18:05:23 +0000 |
commit | cc9380f68d3b9ec9dbfa93ac0b69fb28e40151f6 (patch) | |
tree | 044c5f033955d8815f843a09530fb76e67856818 /src/func.c | |
parent | ff96718b529f98e0f13133f1dcd4f0262a2590d5 (diff) | |
parent | 4c40b7b819bed28a63a04eed32882ee46bc826fc (diff) | |
download | sqlite-cc9380f68d3b9ec9dbfa93ac0b69fb28e40151f6.tar.gz sqlite-cc9380f68d3b9ec9dbfa93ac0b69fb28e40151f6.zip |
Merge the latest trunk enhancements into the wal-shm-exceptions branch.
FossilOrigin-Name: f655d08d019bab0c578886e91ca24fd956d1b3dea9b9c9104812b3cf62e5e556
Diffstat (limited to 'src/func.c')
-rw-r--r-- | src/func.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/func.c b/src/func.c index beafb5431..542d71a23 100644 --- a/src/func.c +++ b/src/func.c @@ -1704,11 +1704,14 @@ static void kahanBabuskaNeumaierStep( ** Add a (possibly large) integer to the running sum. */ static void kahanBabuskaNeumaierStepInt64(volatile SumCtx *pSum, i64 iVal){ - volatile double rVal = (double)iVal; - kahanBabuskaNeumaierStep(pSum, rVal); - if( iVal<=-4503599627370496 || iVal>=+4503599627370496 ){ - double rDiff = (double)(iVal - (i64)rVal); - kahanBabuskaNeumaierStep(pSum, rDiff); + if( iVal<=-4503599627370496LL || iVal>=+4503599627370496LL ){ + i64 iBig, iSm; + iSm = iVal % 16384; + iBig = iVal - iSm; + kahanBabuskaNeumaierStep(pSum, iBig); + kahanBabuskaNeumaierStep(pSum, iSm); + }else{ + kahanBabuskaNeumaierStep(pSum, (double)iVal); } } @@ -1716,11 +1719,17 @@ static void kahanBabuskaNeumaierStepInt64(volatile SumCtx *pSum, i64 iVal){ ** Initialize the Kahan-Babaska-Neumaier sum from a 64-bit integer */ static void kahanBabuskaNeumaierInit( - volatile SumCtx *pSum, + volatile SumCtx *p, i64 iVal ){ - pSum->rSum = (double)iVal; - pSum->rErr = (double)(iVal - (i64)pSum->rSum); + if( iVal<=-4503599627370496LL || iVal>=+4503599627370496LL ){ + i64 iSm = iVal % 16384; + p->rSum = (double)(iVal - iSm); + p->rErr = (double)iSm; + }else{ + p->rSum = (double)iVal; + p->rErr = 0.0; + } } /* |