]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplifications to sqlite3AtoF(), resulting in slightly faster performance
authordrh <>
Mon, 16 Feb 2026 23:52:51 +0000 (23:52 +0000)
committerdrh <>
Mon, 16 Feb 2026 23:52:51 +0000 (23:52 +0000)
and slightly smaller size.

FossilOrigin-Name: 6b9ab641763bc1620a01beec71589506b3b0827bff1c6cd98a5d17c6070050b3

manifest
manifest.tags
manifest.uuid
src/util.c

index 25e473f434faf83713dff1890c4cba049d585949..d472bbb667fd0be1d169ff586d565633d198e4c0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbad\sassert()\sin\sthe\sprevious\scheck-in.
-D 2026-02-16T17:22:17.815
+C Simplifications\sto\ssqlite3AtoF(),\sresulting\sin\sslightly\sfaster\sperformance\nand\sslightly\ssmaller\ssize.
+D 2026-02-16T23:52:51.130
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -803,7 +803,7 @@ F src/trigger.c a40440614bdf523090cc07223f4878f7e3c892bcd1a13afe18f90190daa5945d
 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
-F src/util.c 16c7fcce87e43c612dd579c87d11a085ce5243565b7c324806f4a506c5e696a4
+F src/util.c 06313141ca1d9cf6a80961a6a2084e1f682dfecc741b5c2f527f257f47d61b0a
 F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
 F src/vdbe.c 5328c99dd256ee8132383565a86e253543a85daccfd7477c52f20bac6b385a7f
 F src/vdbe.h 966d0677a540b7ea6549b7c4e1312fc0d830fce3a235a58c801f2cc31cf5ecf9
@@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 67c7c72e9bdf04c920d77006538a202c923fa74b47c81dc3014c2929dac7277d
-R 94ab950169198f260c23800402fd70a5
+P a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+R b9f18dca12593a3b130cb73988b798a1
 U drh
-Z c0318b1fd81a3ec64d379bf447b9b4ea
+Z c47bffdb8f799c234ea9ad61d838f43a
 # Remove this line to create a well-formed Fossil manifest.
index db708de0549f3ecc3ec1464b0dc34605406868be..0839adf5940827acc6f6193c57879937c2c8cc9a 100644 (file)
@@ -1,2 +1,2 @@
-branch numeric-conversion-perf
-tag numeric-conversion-perf
+branch numeric-conversion
+tag numeric-conversion
index fe029aa3b9b66c77b9e399ccdcfad1ea0119d090..5b11965ef028dffdb47b41e0b7d89133aae324d9 100644 (file)
@@ -1 +1 @@
-a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+6b9ab641763bc1620a01beec71589506b3b0827bff1c6cd98a5d17c6070050b3
index bd60ec92e9f36171d77788facf238a573f8852aa..47d6dbee91aa793eb14b9ef9af0c4ab010b32bd1 100644 (file)
@@ -738,12 +738,9 @@ static double sqlite3Fp10Convert2(u64 d, int p){
 int sqlite3AtoF(const char *z, double *pResult){
 #ifndef SQLITE_OMIT_FLOATING_POINT
   /* sign * significand * (10 ^ (esign * exponent)) */
-  int sign = 1;    /* sign of significand */
-  u64 s = 0;       /* significand */
-  int d = 0;       /* adjust exponent for shifting decimal point */
-  int esign = 1;   /* sign of exponent */
-  int e = 0;       /* exponent */
-  int eValid = 1;  /* True exponent is either not used or is well-formed */
+  int neg = 0;     /* True for a negative value */
+  u64 s = 0;       /* mantissa */
+  int d = 0;       /* Value is s * pow(10,d) */
   int nDigit = 0;  /* Number of digits processed */
   int eType = 1;   /* 1: pure integer,  2+: fractional */
 
@@ -754,7 +751,7 @@ int sqlite3AtoF(const char *z, double *pResult){
 
   /* get sign of significand */
   if( *z=='-' ){
-    sign = -1;
+    neg = 1;
     z++;
   }else if( *z=='+' ){
     z++;
@@ -789,8 +786,8 @@ int sqlite3AtoF(const char *z, double *pResult){
 
   /* if exponent is present */
   if( *z=='e' || *z=='E' ){
+    int esign = 1;   /* sign of exponent */
     z++;
-    eValid = 0;
     eType++;
 
     /* get sign of exponent */
@@ -801,10 +798,16 @@ int sqlite3AtoF(const char *z, double *pResult){
       z++;
     }
     /* copy digits to exponent */
-    while( sqlite3Isdigit(*z) ){
-      e = e<10000 ? (e*10 + (*z - '0')) : 10000;
+    if( sqlite3Isdigit(*z) ){
+      int exp = *z - '0';
       z++;
-      eValid = 1;
+      while( sqlite3Isdigit(*z) ){
+        exp = exp<10000 ? (exp*10 + (*z - '0')) : 10000;
+        z++;
+      }
+      d += esign*exp;
+    }else{
+      eType = -1;
     }
   }
 
@@ -813,22 +816,17 @@ int sqlite3AtoF(const char *z, double *pResult){
 
   /* Zero is a special case */
   if( s==0 ){
-    *pResult = sign<0 ? -0.0 : +0.0;
-    goto atofz_return;
+    *pResult = neg ? -0.0 : +0.0;
+  }else{
+    *pResult = sqlite3Fp10Convert2(s,d);
+    if( neg ) *pResult = -*pResult;
+    assert( !sqlite3IsNaN(*pResult) );
   }
 
-  /* adjust exponent by d, and update sign */
-  e = (e*esign) + d;
-
-  *pResult = sqlite3Fp10Convert2(s,e);
-  if( sign<0 ) *pResult = -*pResult;
-  assert( !sqlite3IsNaN(*pResult) );
-
-atofz_return:
   /* return true if number and no extra non-whitespace characters after */
-  if( z[0]==0 && nDigit>0 && eValid ){
+  if( z[0]==0 && nDigit>0 ){
     return eType;
-  }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){
+  }else if( eType>=2 && nDigit>0 ){
     return -1;
   }else{
     return 0;