]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplification of the dekkerMul2() subroutine.
authordrh <>
Wed, 5 Jul 2023 14:42:50 +0000 (14:42 +0000)
committerdrh <>
Wed, 5 Jul 2023 14:42:50 +0000 (14:42 +0000)
FossilOrigin-Name: bfe6432a46fd41bfadf4516a73b4e2523d9b453c3e4486fe6df7e1d25275dfb3

manifest
manifest.uuid
src/util.c

index d124da27561bddd8be45289672f63f743fbb2d4d..ff444b1784dd0706e5fc12057b67e469532dce29 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\sieee754_inc(r,N)\sfunction\sto\sthe\sieee754.c\sextension.
-D 2023-07-05T12:00:32.550
+C Simplification\sof\sthe\sdekkerMul2()\ssubroutine.
+D 2023-07-05T14:42:50.334
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -705,7 +705,7 @@ F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0
 F src/update.c 0aa36561167a7c40d01163238c297297962f31a15a8d742216b3c37cdf25f731
 F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
-F src/util.c 5c6a3c7a88af0cbabb17707314b07f6026410610be73c6b6fba163b1cbf8b5ea
+F src/util.c 04958d3937d7db7ae2d0ee18506c384596dfa909cc0c4a1347bf79081c107b5b
 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
 F src/vdbe.c 74282a947234513872a83b0bab1b8c644ece64b3e27b053ef17677c8ff9c81e0
 F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
@@ -2043,8 +2043,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P fd987508d5589d42b46625c97cfb2feeac70fdb1cb11224610554b07a60644e6
-R a945cf31e1bc8c6f26ee1341b6778e23
+P 9a36f269451d8832f68e223ac3995493704364e7fd0cc772989c96e863a08d29
+R aad77d965a4f588fb4cf332c1c0a5021
 U drh
-Z f1876ec8896b7ebc6d97122422450d0a
+Z 45d04598133329d93f0fdb912f74ae6c
 # Remove this line to create a well-formed Fossil manifest.
index cf4f9e757a1432e1acd51ded80449e0d1f3b8893..df6f400280191959c7513264898a80c83c25dbc1 100644 (file)
@@ -1 +1 @@
-9a36f269451d8832f68e223ac3995493704364e7fd0cc772989c96e863a08d29
\ No newline at end of file
+bfe6432a46fd41bfadf4516a73b4e2523d9b453c3e4486fe6df7e1d25275dfb3
\ No newline at end of file
index f14cbf2594e604801d2af17a6f636744c34c108c..899abce72b11c7216b41e1492bce3bd97baecce3 100644 (file)
@@ -386,23 +386,19 @@ u8 sqlite3StrIHash(const char *z){
   return h;
 }
 
-/* Double-Double multiplication.  *(z,zz) = (x,xx) * (y,yy)
+/* Double-Double multiplication.  (x[0],x[1]) *= (y,yy)
 **
 ** Reference:
 **   T. J. Dekker, "A Floating-Point Technique for Extending the
 **   Available Precision".  1971-07-26.
 */
-static void dekkerMul2(
-  double x,  double xx,
-  double y,  double yy,
-  double *z, double *zz
-){
+static void dekkerMul2(double *x, double y, double yy){
   double hx, tx, hy, ty, p, q, c, cc;
   u64 m;
-  memcpy(&m, &x, 8);
+  memcpy(&m, &x[0], 8);
   m &= 0xfffffffffc000000L;
   memcpy(&hx, &m, 8);
-  tx = x - hx;
+  tx = x[0] - hx;
   memcpy(&m, &y, 8);
   m &= 0xfffffffffc000000L;
   memcpy(&hy, &m, 8);
@@ -411,9 +407,9 @@ static void dekkerMul2(
   q = hx*ty + tx*hy;
   c = p+q;
   cc = p - c + q + tx*ty;
-  cc = x*yy + xx*y + cc;
-  *z = c + cc;
-  *zz = c - *z + cc;
+  cc = x[0]*yy + x[1]*y + cc;
+  x[0] = c + cc;
+  x[1] = c - x[0] + cc;
 }
 
 /*
@@ -587,39 +583,39 @@ do_atof_calc:
     }
     *pResult = r;
   }else{
-    double r, rr;
+    double rr[2];
     u64 s2;
-    r = (double)s;
-    s2 = (u64)r;
-    rr = s>=s2 ? (double)(s - s2) : -(double)(s2 - s);
+    rr[0] = (double)s;
+    s2 = (u64)rr[0];
+    rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s);
     if( e>0 ){
       while( e>=100  ){
         e -= 100;
-        dekkerMul2(r, rr, 1.0e+100, -1.5902891109759918046e+83, &r, &rr);
+        dekkerMul2(rr, 1.0e+100, -1.5902891109759918046e+83);
       }
       while( e>=10   ){
         e -= 10;
-        dekkerMul2(r, rr, 1.0e+10, 0.0, &r, &rr);
+        dekkerMul2(rr, 1.0e+10, 0.0);
       }
       while( e>=1    ){
         e -= 1;
-        dekkerMul2(r, rr, 1.0e+01, 0.0, &r, &rr);
+        dekkerMul2(rr, 1.0e+01, 0.0);
       }
     }else{
       while( e<=-100 ){
         e += 100;
-        dekkerMul2(r, rr, 1.0e-100, -1.99918998026028836196e-117, &r, &rr);
+        dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);
       }
       while( e<=-10  ){
         e += 10;
-        dekkerMul2(r,rr, 1.0e-10, -3.6432197315497741579e-27, &r, &rr);
+        dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);
       }
       while( e<=-1   ){
         e += 1;
-        dekkerMul2(r,rr, 1.0e-01, -5.5511151231257827021e-18, &r, &rr);
+        dekkerMul2(rr, 1.0e-01, -5.5511151231257827021e-18);
       }
     }
-    *pResult = r+rr;
+    *pResult = rr[0]+rr[1];
     if( sqlite3IsNaN(*pResult) ) *pResult = 1e300*1e300;
   }
   if( sign<0 ) *pResult = -*pResult;
@@ -982,35 +978,37 @@ void sqlite3FpDecode(FpDecode *p, double r, int iRound, int mxRound){
     **
     **   SELECT decimal_sci(decimal_sub('1.0e+100',decimal(1.0e+100)));
     */
-    double rr = 0.0;
-    if( r>1.84e+19 ){
-      while( r>1.84e+119 ){
+    double rr[2];
+    rr[0] = r;
+    rr[1] = 0.0;
+    if( rr[0]>1.84e+19 ){
+      while( rr[0]>1.84e+119 ){
         exp += 100;
-        dekkerMul2(r, rr, 1.0e-100, -1.99918998026028836196e-117, &r, &rr);
+        dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);
       }
-      while( r>1.84e+29 ){
+      while( rr[0]>1.84e+29 ){
         exp += 10;
-        dekkerMul2(r,rr, 1.0e-10, -3.6432197315497741579e-27, &r, &rr);
+        dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);
       }
-      while( r>1.84e+19 ){
+      while( rr[0]>1.84e+19 ){
         exp += 1;
-        dekkerMul2(r,rr, 1.0e-01, -5.5511151231257827021e-18, &r, &rr);
+        dekkerMul2(rr, 1.0e-01, -5.5511151231257827021e-18);
       }
     }else{
-      while( r<1.84e-82  ){
+      while( rr[0]<1.84e-82  ){
         exp -= 100;
-        dekkerMul2(r, rr, 1.0e+100, -1.5902891109759918046e+83, &r, &rr);
+        dekkerMul2(rr, 1.0e+100, -1.5902891109759918046e+83);
       }
-      while( r<1.84e+08  ){
+      while( rr[0]<1.84e+08  ){
         exp -= 10;
-        dekkerMul2(r, rr, 1.0e+10, 0.0, &r, &rr);
+        dekkerMul2(rr, 1.0e+10, 0.0);
       }
-      while( r<1.84e+18  ){
+      while( rr[0]<1.84e+18  ){
         exp -= 1;
-        dekkerMul2(r, rr, 1.0e+01, 0.0, &r, &rr);
+        dekkerMul2(rr, 1.0e+01, 0.0);
       }
     }
-    v = rr<0.0 ? (u64)r-(u64)(-rr) : (u64)r+(u64)rr;
+    v = rr[1]<0.0 ? (u64)rr[0]-(u64)(-rr[1]) : (u64)rr[0]+(u64)rr[1];
   }