aboutsummaryrefslogtreecommitdiff
path: root/src/func.c
diff options
context:
space:
mode:
authordrh <>2023-07-10 18:05:23 +0000
committerdrh <>2023-07-10 18:05:23 +0000
commitcc9380f68d3b9ec9dbfa93ac0b69fb28e40151f6 (patch)
tree044c5f033955d8815f843a09530fb76e67856818 /src/func.c
parentff96718b529f98e0f13133f1dcd4f0262a2590d5 (diff)
parent4c40b7b819bed28a63a04eed32882ee46bc826fc (diff)
downloadsqlite-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.c25
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;
+ }
}
/*