aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <>2024-10-01 16:55:30 +0000
committerdrh <>2024-10-01 16:55:30 +0000
commitdac22f656646db9b9429d13c7fcd0a20d6b8a9d6 (patch)
tree9bc2db4d724028df0fe495426dd576a1ce5ec51b
parented94e0e6778ca00db96690fe93820436cf2676d2 (diff)
downloadsqlite-dac22f656646db9b9429d13c7fcd0a20d6b8a9d6.tar.gz
sqlite-dac22f656646db9b9429d13c7fcd0a20d6b8a9d6.zip
Add compile-time option -DSQLITE_USE_LONG_DOUBLE=0 to omit all attempts to use
"long double". Or =1 to omit attempts to use the Dekker algorithms to achieve high-resolution floating point. FossilOrigin-Name: ca5964ef70efad3332e0bf9c158eb5fd5006d3022051d1ac506c097c427735a1
-rw-r--r--manifest20
-rw-r--r--manifest.uuid2
-rw-r--r--src/main.c15
-rw-r--r--src/sqliteInt.h35
-rw-r--r--src/util.c4
-rw-r--r--src/vdbeaux.c2
6 files changed, 59 insertions, 19 deletions
diff --git a/manifest b/manifest
index 77242f8ac..38a8eea1a 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\san\s#if'd-out\sblock\sto\ssqlite3-wasm.c\smentioning\sthe\sLONGDOUBLE_TYPE,\sas\sbrought\sup\sin\s[forum:cbfb0d0ac0a4e349\s|\sforum\spost\scbfb0d0ac].\sNo\sfunctional\schanges.
-D 2024-10-01T10:49:30.088
+C Add\scompile-time\soption\s-DSQLITE_USE_LONG_DOUBLE=0\sto\somit\sall\sattempts\sto\suse\n"long\sdouble".\s\sOr\s=1\sto\somit\sattempts\sto\suse\sthe\sDekker\salgorithms\sto\sachieve\nhigh-resolution\sfloating\spoint.
+D 2024-10-01T16:55:30.223
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -730,7 +730,7 @@ F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70
F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
-F src/main.c 4db6e3bde55ba0b24ccc83600c2b6ea11429f61ce7b3a2e7e3b42e1b45366c3e
+F src/main.c 651be111d1fc05dae62d31cc41335748c27c67455cf777a2d7f48ce1fef585f6
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -772,7 +772,7 @@ F src/shell.c.in d71d2463459e6cd9c2f2d702545aed5113ffbcea963c19c1e6d3a6d762ef959
F src/sqlite.h.in b20547021d20ba016c2fd0500f14f08a21ff23e64a0ed93e72ca0fecb9e1d0a0
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h 5978cbb11becc3ce6471015d770d95f694ece06336c496f691df1b02460e9cd5
+F src/sqliteInt.h e4940181e20f67b23b7e1b43807ceb3a9cdb38860225de3d5df7eea37bbe6651
F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728
F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -835,13 +835,13 @@ F src/trigger.c 0bb986a5b96047fd597c6aac28588853df56064e576e6b81ba777ef2ccaac461
F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 7bc550af6f3ddd5f5dc82d092c41f728acb760c92e0b47f391963b01ae52569b
-F src/util.c 5d1a0134cf4240648d1c6bb5cc8efaca0ea2b5d5c840985aec7e947271f04375
+F src/util.c ae41aadb960cb15d17e8bb9ec0ebb514e1f7ead773ae9fba281ed67c4d240c48
F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40
F src/vdbe.c be5f58bc29f60252e041a618eae59e8d57d460ba136c5403cf0abf955560c457
F src/vdbe.h c2549a215898a390de6669cfa32adba56f0d7e17ba5a7f7b14506d6fd5f0c36a
F src/vdbeInt.h af7d7e8291edd0b19f2cd698e60e4d4031078f9a2f2328ac8f0b7efb134f8a1d
F src/vdbeapi.c 53c7e26a2c0821a892b20eee2cde4656e31998212f3d515576c780dfaa45fd17
-F src/vdbeaux.c 676dbee99b4febdd94bc9658667a2e3bc413c4c0e356242d90f98a1155d513e5
+F src/vdbeaux.c aa1bd97dc53406c26619b847f4c7f4f0137ee8c7ba9b266f93351e06aefb522e
F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797
F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2
F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f
@@ -2213,8 +2213,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f0c5a86fefecded07e098e1326dd54c72504b0bb480f710e395d4041a322dfcb
-R 95713aa430bd45b55e204d70dfdb0e42
-U stephan
-Z 75aa095723616959401f433a579dd985
+P 0b83e8f1ef53b35a9dda0740b4922b8691428f7484f3058833a961f3f8d0b178
+R 1afae59e0efb08982f93adc40d14c2a9
+U drh
+Z 56bb71650eaf744de022c729aea7d991
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index f0f46579d..72b7e4100 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-0b83e8f1ef53b35a9dda0740b4922b8691428f7484f3058833a961f3f8d0b178
+ca5964ef70efad3332e0bf9c158eb5fd5006d3022051d1ac506c097c427735a1
diff --git a/src/main.c b/src/main.c
index 6ab09c556..bd0cbc731 100644
--- a/src/main.c
+++ b/src/main.c
@@ -159,6 +159,7 @@ char *sqlite3_temp_directory = 0;
*/
char *sqlite3_data_directory = 0;
+#if !defined(SQLITE_OMIT_WSD) && !defined(SQLITE_USE_LONG_DOUBLE)
/*
** Determine whether or not high-precision (long double) floating point
** math works correctly on CPU currently running.
@@ -183,7 +184,7 @@ static SQLITE_NOINLINE int hasHighPrecisionDouble(int rc){
return b!=c;
}
}
-
+#endif /* !SQLITE_OMIT_WSD && !SQLITE_USE_LONG_DOUBLE */
/*
** Initialize SQLite.
@@ -380,9 +381,7 @@ int sqlite3_initialize(void){
}
#endif
- /* Experimentally determine if high-precision floating point is
- ** available. */
-#ifndef SQLITE_OMIT_WSD
+#if !defined(SQLITE_OMIT_WSD) && !defined(SQLITE_USE_LONG_DOUBLE)
sqlite3Config.bUseLongDouble = hasHighPrecisionDouble(rc);
#endif
@@ -4645,12 +4644,18 @@ int sqlite3_test_control(int op, ...){
** X==0 Disable bUseLongDouble
** X==1 Enable bUseLongDouble
** X>=2 Set bUseLongDouble to its default value for this platform
+ **
+ ** If the SQLITE_USE_LONG_DOUBLE compile-time option has been used, then
+ ** the bUseLongDouble setting is fixed. This test-control becomes a
+ ** no-op, except that it still reports the fixed setting.
*/
case SQLITE_TESTCTRL_USELONGDOUBLE: {
+#if !defined(SQLITE_USE_LONG_DOUBLE)
int b = va_arg(ap, int);
if( b>=2 ) b = hasHighPrecisionDouble(b);
if( b>=0 ) sqlite3Config.bUseLongDouble = b>0;
- rc = sqlite3Config.bUseLongDouble!=0;
+#endif
+ rc = SqliteUseLongDouble!=0;
break;
}
#endif
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 604f7e975..5b166d9a3 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -4249,6 +4249,41 @@ typedef struct {
# define Tuning(X) 0
#endif
+/* By default, SQLite will use long double if the long double type
+** actually provides higher resolution than double. This use or non-use
+** of long double is switchable at run-time by a test-control. Dekker
+** algorithms are used for high-precision floating point when long double
+** is not available.
+**
+** Having the run-time option to enable/disable long double support
+** causes problems for some compiler tool chains. So the following
+** compile-time option is available to permanently enable/disable the use
+** of long double.
+**
+** -DSQLITE_USE_LONG_DOUBLE=0 Omit all use of "long double" from
+** the code. Instead, the Dekker algorithm
+** is always used when high-precision
+** floating point is required.
+**
+** -DSQLITE_USE_LONG_DOUBLE=1 Always use long double when high
+** precision is needed. Never fall back
+** to using Dekker algorithms.
+**
+** If the SQLITE_USE_LONG_DOUBLE macro is not defined, then the determination
+** of whether or not to use long double is made at run-time.
+*/
+#ifndef SQLITE_USE_LONG_DOUBLE
+# define SqliteUseLongDouble sqlite3Config.bUseLongDouble
+#elif SQLITE_USE_LONG_DOUBLE+0==1
+# define SqliteUseLongDouble 1
+#elif SQLITE_USE_LONG_DOUBLE+0==0
+# undef LONGDOUBLE_TYPE
+# define LONGDOUBLE_TYPE double
+# define SqliteUseLongDouble 0
+#else
+# error "SQLITE_USE_LONG_DOUBLE should be set to either 0 or 1"
+#endif
+
/*
** Structure containing global configuration data for the SQLite library.
**
diff --git a/src/util.c b/src/util.c
index 0cebb474a..7a82ce81b 100644
--- a/src/util.c
+++ b/src/util.c
@@ -652,7 +652,7 @@ do_atof_calc:
if( e==0 ){
*pResult = s;
- }else if( sqlite3Config.bUseLongDouble ){
+ }else if( SqliteUseLongDouble ){
LONGDOUBLE_TYPE r = (LONGDOUBLE_TYPE)s;
if( e>0 ){
while( e>=100 ){ e-=100; r *= 1.0e+100L; }
@@ -1063,7 +1063,7 @@ void sqlite3FpDecode(FpDecode *p, double r, int iRound, int mxRound){
/* Multiply r by powers of ten until it lands somewhere in between
** 1.0e+19 and 1.0e+17.
*/
- if( sqlite3Config.bUseLongDouble ){
+ if( SqliteUseLongDouble ){
LONGDOUBLE_TYPE rr = r;
if( rr>=1.0e+19 ){
while( rr>=1.0e+119L ){ exp+=100; rr *= 1.0e-100L; }
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index a66bdecff..929190b3a 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -4528,7 +4528,7 @@ int sqlite3IntFloatCompare(i64 i, double r){
** than NULL */
return 1;
}
- if( sqlite3Config.bUseLongDouble ){
+ if( SqliteUseLongDouble ){
LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i;
testcase( x<r );
testcase( x>r );