From: drh <> Date: Sat, 7 Dec 2024 19:57:30 +0000 (+0000) Subject: Yet another iteration of the solution to the floating-point conversion X-Git-Tag: major-relase~77 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9f53d0c8179a3b69f788bd31749fc7c15092be87;p=thirdparty%2Fsqlite.git Yet another iteration of the solution to the floating-point conversion problem - this what avoids complaints about oversize double values from -fsanitize. FossilOrigin-Name: fc6904a508eb732b1cb5cc12321a0d637d97e1e066a022a2c93cb50595f3a86a --- diff --git a/manifest b/manifest index 8c3849164d..37a1d128b2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\scleaner\sand\smore\srobust\ssolution\sto\sthe\sfloating-point\sconversion\sproblem\noriginally\sfixed\sby\s[81342fa6dd03fffb]. -D 2024-12-07T19:06:25.786 +C Yet\sanother\siteration\sof\sthe\ssolution\sto\sthe\sfloating-point\sconversion\nproblem\s-\sthis\swhat\savoids\scomplaints\sabout\soversize\sdouble\svalues\nfrom\s-fsanitize. +D 2024-12-07T19:57:30.181 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -844,7 +844,7 @@ F src/trigger.c 0bb986a5b96047fd597c6aac28588853df56064e576e6b81ba777ef2ccaac461 F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba -F src/util.c bf4e641c1e2d5cf40501f5f6990df412d2b6c301880a74750e7eefc4315f72bc +F src/util.c aaafeaa62045ad6bc7c62a91d462800fd68f1e441ad944b4350c90930d2b26e4 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f5b8fd77635e5e6d2d88a1ce74e1bd6c4311260a2b695e5055b898b880bf5718 -R 8f59f36dbcd9cf41cdce9fb59aaabbba +P 351de57f80b73045448c71d3402d877ff5d72418b1f5fc34c8147a04f7c5cb78 +R 9235bc27c60f84c2f272e364b7977ec9 U drh -Z 7774bee9e6cea167bb38890889846afb +Z 7dbec0e81d7a36c7e20ad06b81edda4b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 24849f9a8a..cde712b675 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -351de57f80b73045448c71d3402d877ff5d72418b1f5fc34c8147a04f7c5cb78 +fc6904a508eb732b1cb5cc12321a0d637d97e1e066a022a2c93cb50595f3a86a diff --git a/src/util.c b/src/util.c index e134f7a7d8..ab8249c8d5 100644 --- a/src/util.c +++ b/src/util.c @@ -653,15 +653,15 @@ do_atof_calc: } rr[0] = (double)s; - s2 = (u64)rr[0]; - rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s); - if( rr[1]>1e-10*rr[0] ){ - /* On some floating-point processing units, doing the round - ** trip from u64 to double back to u64 can give a wonky value - ** when the original u64 is close to LARGEST_UINT64. If we - ** did get an overly large error value, just set it to zero. */ + assert( sizeof(s2)==sizeof(rr[0]) ); + memcpy(&s2, &rr[0], sizeof(s2)); + if( s2<=0x43efffffffffffffLL ){ + s2 = (u64)rr[0]; + rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s); + }else{ rr[1] = 0.0; } + assert( rr[1]<=1.0e-10*rr[0] ); /* Equal only when rr[0]==0.0 */ if( e>0 ){ while( e>=100 ){