Format specifiers are forcing 15 digits of precision, so the default precision 
of 6 is being ignored.  Here is a patch that fixes the code in the amalgamation 
so the default precision of 6 will be used for floating point to text 
operations.  I don't know if both need to be patched, but this is the 
root-cause of the default precision in the conversion routines not having any 
effect.

Index: sqlite3.c
==================================================================
--- sqlite3.c
+++ sqlite3.c
@@ -59458,11 +59458,11 @@
   */
   if( fg & MEM_Int ){
     sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i);
   }else{
     assert( fg & MEM_Real );
-    sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
+    sqlite3_snprintf(nByte, pMem->z, "%!g", pMem->r);
   }
   pMem->n = sqlite3Strlen30(pMem->z);
   pMem->enc = SQLITE_UTF8;
   pMem->flags |= MEM_Str|MEM_Term;
   sqlite3VdbeChangeEncoding(pMem, enc);
@@ -65065,11 +65065,11 @@
       if( pVar->flags & MEM_Null ){
         sqlite3StrAccumAppend(&out, "NULL", 4);
       }else if( pVar->flags & MEM_Int ){
         sqlite3XPrintf(&out, "%lld", pVar->u.i);
       }else if( pVar->flags & MEM_Real ){
-        sqlite3XPrintf(&out, "%!.15g", pVar->r);
+        sqlite3XPrintf(&out, "%!g", pVar->r);
       }else if( pVar->flags & MEM_Str ){
 #ifndef SQLITE_OMIT_UTF16
         u8 enc = ENC(db);
         if( enc!=SQLITE_UTF8 ){
           Mem utf8;

Or in the fossil repository:

D:\Source\sqlite3\src>fossil diff
Index: src/vdbemem.c
==================================================================
--- src/vdbemem.c
+++ src/vdbemem.c
@@ -224,11 +224,11 @@
   */
   if( fg & MEM_Int ){
     sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i);
   }else{
     assert( fg & MEM_Real );
-    sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
+    sqlite3_snprintf(nByte, pMem->z, "%!g", pMem->r);
   }
   pMem->n = sqlite3Strlen30(pMem->z);
   pMem->enc = SQLITE_UTF8;
   pMem->flags |= MEM_Str|MEM_Term;
   sqlite3VdbeChangeEncoding(pMem, enc);

Index: src/vdbetrace.c
==================================================================
--- src/vdbetrace.c
+++ src/vdbetrace.c
@@ -119,11 +119,11 @@
       if( pVar->flags & MEM_Null ){
         sqlite3StrAccumAppend(&out, "NULL", 4);
       }else if( pVar->flags & MEM_Int ){
         sqlite3XPrintf(&out, "%lld", pVar->u.i);
       }else if( pVar->flags & MEM_Real ){
-        sqlite3XPrintf(&out, "%!.15g", pVar->r);
+        sqlite3XPrintf(&out, "%!g", pVar->r);
       }else if( pVar->flags & MEM_Str ){
 #ifndef SQLITE_OMIT_UTF16
         u8 enc = ENC(db);
         if( enc!=SQLITE_UTF8 ){
           Mem utf8;


If there was a reason for setting the precision to 15, then perhaps another 
SQLITE_DEFAULT_PRECISION could be defined with a default of 6, to permit the 
build to override the default in printf.c

--- printf.c
+++ printf.c
@@ -154,10 +154,17 @@
 #ifndef SQLITE_PRINT_BUF_SIZE
 # define SQLITE_PRINT_BUF_SIZE 70
 #endif
 #define etBUFSIZE SQLITE_PRINT_BUF_SIZE  /* Size of the output buffer */

+/*
+** Default Precision is 6 and may be overridden
+*/
+#ifndef SQLITE_DEFAULT_PRECISION
+#define SQLITE_DEFAULT_PRECISION 6
+#endif
+
 /*
 ** Render a string given by "fmt" into the StrAccum object.
 */
 void sqlite3VXPrintf(
   StrAccum *pAccum,                  /* Accumulate results here */
@@ -400,11 +407,11 @@
       case etGENERIC:
         realvalue = va_arg(ap,double);
 #ifdef SQLITE_OMIT_FLOATING_POINT
         length = 0;
 #else
-        if( precision<0 ) precision = 6;         /* Set default precision */
+        if( precision<0 ) precision = SQLITE_DEFAULT_PRECISION;         /* Set 
default precision */
         if( realvalue<0.0 ){
           realvalue = -realvalue;
           prefix = '-';
         }else{
           if( flag_plussign )          prefix = '+';

---
()  ascii ribbon campaign against html e-mail
/\  www.asciiribbon.org


> -----Original Message-----
> From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-
> boun...@sqlite.org] On Behalf Of Keith Medcalf
> Sent: Saturday, 16 June, 2012 14:00
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] VERY weird rounding error
> 
> 
> Found the problem.
> 
> At sqlite3.c 19883 if( precision<0 ) precision = 6;         /* Set default
> precision */
> 
> precision has a value of 15.  It should be 14 or less.  Don't know where it
> is getting this value from however.
> 
> 
> 
> ---
> ()  ascii ribbon campaign against html e-mail
> /\  www.asciiribbon.org
> 
> 
> > -----Original Message-----
> > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-
> > boun...@sqlite.org] On Behalf Of Keith Medcalf
> > Sent: Saturday, 16 June, 2012 13:28
> > To: General Discussion of SQLite Database
> > Subject: Re: [sqlite] VERY weird rounding error
> >
> >
> > Are you using the "same machine code" or merely "the same source code"?
> >
> > The sqlite3 shell.c always asks for the results back converted to text.
> >
> > Does your "other" shell ask for the results as "text" or as a double?
> >
> > ...>python
> > Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
> on
> > win32
> > Type "help", "copyright", "credits" or "license" for more information.
> > >>> import apsw
> > >>> import apswrow
> > >>> import math
> > >>> db = apsw.Connection(':memory:')
> > >>> cr = db.cursor()
> > >>> r1 = cr.execute('select 99990.1 as double;').next()
> > >>> r2 = cr.execute('select cast(99990.1 as text) as textval;').next()
> >
> > >>> r1
> > Row(double=99990.1)
> >
> > >>> type(r1[0])
> > <type 'float'>
> >
> > >>> math.frexp(r1[0])
> > (0.7628639221191407, 17)
> >
> > >>> math.frexp(float('99990.1'))
> > (0.7628639221191407, 17)
> >
> > >>> r2
> > Row(textval=u'99990.1000000001')
> > >>> type(r2[0])
> > <type 'unicode'>
> >
> > >>> math.frexp(float(r2[0]))
> > (0.7628639221191413, 17)
> >
> > ...>sqlite3d
> > SQLite version 3.7.13 2012-06-11 02:05:22
> > Enter ".help" for instructions
> > Enter SQL statements terminated with a ";"
> > sqlite> select 99990.1;
> > 99990.1000000001
> > sqlite> select cast(99990.1 as double);
> > 99990.1000000001
> > sqlite> select cast(99990.1 as text);
> > 99990.1000000001
> > sqlite> select 99990.1000000001;
> > 99990.1000000001
> >
> > My conclusion is that the conversion from floating point to text in the
> > SQLite database engine is inexact and designed as a convenience function
> > only.  However, it is consistent. My recommendation would be that if you
> want
> > "text" then use "text" everywhere.  If you want floating point, then use
> > floating point everywhere.  You should not expect that wild conversions
> > should produce the results you want.
> >
> > ---
> > ()  ascii ribbon campaign against html e-mail
> > /\  www.asciiribbon.org
> >
> >
> > > -----Original Message-----
> > > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-
> > > boun...@sqlite.org] On Behalf Of Etienne
> > > Sent: Saturday, 16 June, 2012 11:32
> > > To: General Discussion of SQLite Database
> > > Subject: [sqlite] VERY weird rounding error
> > >
> > > Hi Simon,
> > >
> > > Once again, I really do not care of the accuracy.
> > >
> > > I KNOW 0.1 CAN NOT BE STORED EXACTLY IN A REAL VARIABLE.
> > >
> > > I just try to figure out why the SAME CODE (sqlite3 library) with the
> SAME
> > > INPUT gives DIFFERENT RESULTS (no matter how accurate/exact they
> > individually
> > > are!) when linked to different shells.
> > >
> > >
> > > Etienne
> > >
> > >
> > > ----- Original message -----
> > > From: Simon Slavin <slav...@bigfraud.org>
> > > To: General Discussion of SQLite Database <sqlite-users@sqlite.org>
> > > Subject: Re: [sqlite] VERY weird rounding error: details
> > > Date: Sat, 16 Jun 2012 18:13:29 +0100
> > >
> > >
> > > On 16 Jun 2012, at 5:41pm, Etienne <ejlist-sql...@yahoo.fr> wrote:
> > >
> > > > 19913:   realvalue *= 0.1;
> > >
> > > This operation cannot be correctly executed while holding the value in a
> > real
> > > variable.  You will get inconsistent results.  Please read the reference
> I
> > > gave earlier for an explanation of why it is pointless trying to get
> > perfect
> > > accuracy while handling a value of 0.1 in a real variable.
> > >
> > > Simon.
> > > _______________________________________________
> > > sqlite-users mailing list
> > > sqlite-users@sqlite.org
> > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > > _______________________________________________
> > > sqlite-users mailing list
> > > sqlite-users@sqlite.org
> > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> >
> >
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> 
> 
> 
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to