Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Determine at start time whether or not the underlying hardware supports high-precision long double computations. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | runtime-longdouble-test |
Files: | files | file ages | folders |
SHA3-256: |
9a854b919667e0e679a259542b2ee444 |
User & Date: | drh 2023-09-13 20:06:46 |
Context
2023-09-13
| ||
20:35 | Improved comments on the hasHighPrecisionDouble() routine. No changes to the underlying code. (Closed-Leaf check-in: 810c635c user: drh tags: runtime-longdouble-test) | |
20:06 | Determine at start time whether or not the underlying hardware supports high-precision long double computations. (check-in: 9a854b91 user: drh tags: runtime-longdouble-test) | |
17:16 | Doc corrections for the previous checkin. (check-in: 9ea0a9f3 user: stephan tags: trunk) | |
Changes
Changes to src/main.c.
︙ | ︙ | |||
154 155 156 157 158 159 160 161 162 163 164 165 166 167 | ** If the following global variable points to a string which is the ** name of a directory, then that directory will be used to store ** all database files specified with a relative pathname. ** ** See also the "PRAGMA data_store_directory" SQL command. */ char *sqlite3_data_directory = 0; /* ** Initialize SQLite. ** ** This routine must be called to initialize the memory allocation, ** VFS, and mutex subsystems prior to doing any serious work with ** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT | > > > > > > > > > > > > > > > > > > > > | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | ** If the following global variable points to a string which is the ** name of a directory, then that directory will be used to store ** all database files specified with a relative pathname. ** ** See also the "PRAGMA data_store_directory" SQL command. */ char *sqlite3_data_directory = 0; /* ** Determine what the default bUseLongDouble value should be and set it. */ static SQLITE_NOINLINE int hasHighPrecisionDouble(int rc){ if( sizeof(LONGDOUBLE_TYPE)<=8 ){ return 0; }else{ /* Just because sizeof(long double)>8 does not mean that the underlying ** hardware actually supports high-precision floating point. Do a test ** to verify that it really does */ LONGDOUBLE_TYPE a, b, c; rc++; a = 1.0+rc*0.1; b = 1.0e+18+rc*25.0; c = a+b; return b!=c; } } /* ** Initialize SQLite. ** ** This routine must be called to initialize the memory allocation, ** VFS, and mutex subsystems prior to doing any serious work with ** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT |
︙ | ︙ | |||
349 350 351 352 353 354 355 356 357 358 359 360 361 362 | */ #ifdef SQLITE_EXTRA_INIT if( bRunExtraInit ){ int SQLITE_EXTRA_INIT(const char*); rc = SQLITE_EXTRA_INIT(0); } #endif return rc; } /* ** Undo the effects of sqlite3_initialize(). Must not be called while ** there are outstanding database connections or memory allocations or | > > > > | 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 | */ #ifdef SQLITE_EXTRA_INIT if( bRunExtraInit ){ int SQLITE_EXTRA_INIT(const char*); rc = SQLITE_EXTRA_INIT(0); } #endif /* Experimentally determine if high-precision floating point is ** available. */ sqlite3Config.bUseLongDouble = hasHighPrecisionDouble(rc); return rc; } /* ** Undo the effects of sqlite3_initialize(). Must not be called while ** there are outstanding database connections or memory allocations or |
︙ | ︙ | |||
4550 4551 4552 4553 4554 4555 4556 | #if !defined(SQLITE_OMIT_WSD) /* sqlite3_test_control(SQLITE_TESTCTRL_USELONGDOUBLE, int X); ** ** X<0 Make no changes to the bUseLongDouble. Just report value. ** X==0 Disable bUseLongDouble ** X==1 Enable bUseLongDouble | | | | 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 | #if !defined(SQLITE_OMIT_WSD) /* sqlite3_test_control(SQLITE_TESTCTRL_USELONGDOUBLE, int X); ** ** X<0 Make no changes to the bUseLongDouble. Just report value. ** X==0 Disable bUseLongDouble ** X==1 Enable bUseLongDouble ** X>=2 Set bUseLongDouble to its default value for this platform */ case SQLITE_TESTCTRL_USELONGDOUBLE: { int b = va_arg(ap, int); if( b>=2 ) b = hasHighPrecisionDouble(b); if( b>=0 ) sqlite3Config.bUseLongDouble = b>0; rc = sqlite3Config.bUseLongDouble!=0; break; } #endif |
︙ | ︙ |
Changes to src/vdbeaux.c.
︙ | ︙ | |||
4463 4464 4465 4466 4467 4468 4469 | /* ** Do a comparison between a 64-bit signed integer and a 64-bit floating-point ** number. Return negative, zero, or positive if the first (i64) is less than, ** equal to, or greater than the second (double). */ int sqlite3IntFloatCompare(i64 i, double r){ | | | 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 | /* ** Do a comparison between a 64-bit signed integer and a 64-bit floating-point ** number. Return negative, zero, or positive if the first (i64) is less than, ** equal to, or greater than the second (double). */ int sqlite3IntFloatCompare(i64 i, double r){ if( sqlite3Config.bUseLongDouble ){ LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; testcase( x<r ); testcase( x>r ); testcase( x==r ); if( x<r ) return -1; if( x>r ) return +1; /*NO_TEST*/ /* work around bugs in gcov */ return 0; /*NO_TEST*/ /* work around bugs in gcov */ |
︙ | ︙ |