]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Attempt to handle numbers at the limits of the IEEE 754 range better (nan.test now...
authorshane <shane@noemail.net>
Mon, 7 Sep 2009 03:48:52 +0000 (03:48 +0000)
committershane <shane@noemail.net>
Mon, 7 Sep 2009 03:48:52 +0000 (03:48 +0000)
FossilOrigin-Name: 2a74ae1969aeec93576a44e11177677e6f3cea9c

manifest
manifest.uuid
src/util.c

index d97af3eed7ac7ec9526cad737414578a1c52ba9a..aa0928931a571d54cf82fe557e4f4eff52126dc2 100644 (file)
--- 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
index fb0b520154aa3de2e4fc5ab13dd6a751e3fec6be..9dcb56fba4690c12348f66f3105722f47b111ee8 100644 (file)
@@ -1 +1 @@
-438e1577d0f9ceb2851ee0df0df18f0229eca491
\ No newline at end of file
+2a74ae1969aeec93576a44e11177677e6f3cea9c
\ No newline at end of file
index 085d7140e4ae2e6cfffa32fc8b5ee2ca268c0d94..d12bcd53603b81a45933b6038915831765ceae89 100644 (file)
@@ -375,14 +375,26 @@ int sqlite3AtoF(const char *z, double *pResult){
     ** and store in result. */\r
     if( e ){\r
       double scale = 1.0;\r
-      /* 1.0e+22 is the largest power of 10 than can be \r
-      ** represented exactly. */\r
-      while( e%22 ) { scale *= 1.0e+1; e -= 1; }\r
-      while( e>0 ) { scale *= 1.0e+22; e -= 22; }\r
-      if( esign<0 ){\r
-        result = s / scale;\r
+      /* attempt to handle extremely small/large numbers better */\r
+      if( e>307 && e<342 ){\r
+        while( e%308 ) { scale *= 1.0e+1; e -= 1; }\r
+        if( esign<0 ){\r
+          result = s / scale;\r
+          result /= 1.0e+308;\r
+        }else{\r
+          result = s * scale;\r
+          result *= 1.0e+308;\r
+        }\r
       }else{\r
-        result = s * scale;\r
+        /* 1.0e+22 is the largest power of 10 than can be \r
+        ** represented exactly. */\r
+        while( e%22 ) { scale *= 1.0e+1; e -= 1; }\r
+        while( e>0 ) { scale *= 1.0e+22; e -= 22; }\r
+        if( esign<0 ){\r
+          result = s / scale;\r
+        }else{\r
+          result = s * scale;\r
+        }\r
       }\r
     } else {\r
       result = (double)s;\r