1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-11 01:42:22 +03:00

Use ideas from T. J. Dekker in "A Floating-Point Technique for Extending the

Available Precision" (1971-07-26) to enhance the accuracy of the SUM()
aggregate function in cases where input magnitudes vary wildly.

FossilOrigin-Name: 439fc00fee62b4db3751860485e21a99cae4fd1f5d911b2c08651a1466245ecc
This commit is contained in:
drh
2023-06-26 19:35:20 +00:00
parent d2b9cdd592
commit 12b198f1a2
5 changed files with 88 additions and 30 deletions

View File

@@ -1750,3 +1750,43 @@ int sqlite3VListNameToNum(VList *pIn, const char *zName, int nName){
|| defined(SQLITE_ENABLE_STMT_SCANSTATUS)
# include "hwtime.h"
#endif
/***************************************************************************
** Double-Double arithmetic.
**
** Reference:
** T. J. Dekker, "A Floating-Point Technique for Extending the
** Available Precision". 1971-07-26.
*/
/* Compute z = (i64)x */
void sqlite3DDFromInt(i64 x, double *z){
z[0] = (double)x;
z[1] = (double)(x - (i64)z[0]);
}
/* Compute z = x + y */
void sqlite3DDAdd(double x, double xx, double y, double yy, double *z){
double r, s;
r = x + y;
if( fabs(x)>fabs(y) ){
s = x - r + y + yy + xx;
}else{
s = y - r + x + xx + yy;
}
z[0] = r+s;
z[1] = r - z[0] + s;
}
/* Compute z = x - y */
void sqlite3DDSub(double x, double xx, double y, double yy, double *z){
double r, s;
r = x - y;
if( fabs(x)>fabs(y) ){
s = x - r - y - yy + xx;
}else{
s = -y - r + x + xx - yy;
}
z[0] = r+s;
z[1] = r - z[0] + s;
}