diff --git a/manifest b/manifest index d97af3eed7..aa0928931a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\sinternal\sAtoF\sto\simprove\s"accuracy"\swhen\smeasured\sagainst\sbuilt-in\sGCC\satof(). -D 2009-09-07T02:46:32 +C Attempt\sto\shandle\snumbers\sat\sthe\slimits\sof\sthe\sIEEE\s754\srange\sbetter\s(nan.test\snow\spasses). +D 2009-09-07T03:48:53 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 73ddeec9dd10b85876c5c2ce1fdce627e1dcc7f8 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -203,7 +203,7 @@ F src/tokenize.c af8a56e6a50c5042fc305bfa796275e9bf26ff2b F src/trigger.c 8158237fc5fa4b51a126a294791729c64d27a0a9 F src/update.c 12ffd68c2f241c730d5e051eb29b23e90682ff8a F src/utf.c 3ca2c9461b8e942c68da28bfccd448663f536a6f -F src/util.c 7404ac078125aafc0e274b2d1a918c3f15b50294 +F src/util.c 59d4e9456bf1fe581f415a783fa0cee6115c8f35 F src/vacuum.c 3fe0eebea6d2311c1c2ab2962887d11f7a4dcfb0 F src/vdbe.c addf5f6fefe9b9c6ca8819efbf52cfce8bd68089 F src/vdbe.h 080fe6bc1264438becb8bf9b9f3c84074c336b78 @@ -750,7 +750,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 2aeab80e5b84f5e94c5c99b4adeca805601c844b -R 0b92cbb9074dfe690c0e4c14e6998bde +P 438e1577d0f9ceb2851ee0df0df18f0229eca491 +R c2daf7f44258efdd4b9472e2943bb165 U shane -Z 82d0c356acbda85944f3ae28efe12d94 +Z 2480ce6a3608c9caf8089d33acaa4dae diff --git a/manifest.uuid b/manifest.uuid index fb0b520154..9dcb56fba4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -438e1577d0f9ceb2851ee0df0df18f0229eca491 \ No newline at end of file +2a74ae1969aeec93576a44e11177677e6f3cea9c \ No newline at end of file diff --git a/src/util.c b/src/util.c index 085d7140e4..d12bcd5360 100644 --- a/src/util.c +++ b/src/util.c @@ -375,14 +375,26 @@ int sqlite3AtoF(const char *z, double *pResult){ ** and store in result. */ if( e ){ double scale = 1.0; - /* 1.0e+22 is the largest power of 10 than can be - ** represented exactly. */ - while( e%22 ) { scale *= 1.0e+1; e -= 1; } - while( e>0 ) { scale *= 1.0e+22; e -= 22; } - if( esign<0 ){ - result = s / scale; + /* attempt to handle extremely small/large numbers better */ + if( e>307 && e<342 ){ + while( e%308 ) { scale *= 1.0e+1; e -= 1; } + if( esign<0 ){ + result = s / scale; + result /= 1.0e+308; + }else{ + result = s * scale; + result *= 1.0e+308; + } }else{ - result = s * scale; + /* 1.0e+22 is the largest power of 10 than can be + ** represented exactly. */ + while( e%22 ) { scale *= 1.0e+1; e -= 1; } + while( e>0 ) { scale *= 1.0e+22; e -= 22; } + if( esign<0 ){ + result = s / scale; + }else{ + result = s * scale; + } } } else { result = (double)s;