And if set tcl_precision ...

--------------------------------------------------------------------

#!/usr/local/bin/tclsh8.6

# do_test atof1-1.$i.1

package require platform
puts "\nplatform: [platform::generic]"

set tcl_precision 15

puts "sqlite version: [package require sqlite3]"
sqlite db :memory:

set xf [format %.32e 4.40035364203127786031058909193863e+118]
set x  [expr {1*$xf}]

puts [format "\nxf = %.32e\nx  = %.15e"   $xf $x]
puts [format "\nxf = %.60e\nx  = %.60e\n" $xf $x]

puts [format "db eval \"SELECT \$xf=\\\$x\" : %s" [db eval "SELECT $xf=\$x"]]
puts [format "expr { \$xf == \$x }       : %s\n"  [expr { $xf == $x }]]

puts [format "db eval \"SELECT \$xf\"  = %s" [db eval "SELECT $xf"]]
puts [format "db eval \"SELECT \\\$xf\" = %s" [db eval "SELECT \$xf"]]
puts [format "db eval \"SELECT \\\$x\"  = %s" [db eval "SELECT \$x"]]

db eval "CREATE TABLE t (a text, b real, c int)"
db eval "INSERT INTO t VALUES($xf,\$xf,1)"
db eval "INSERT INTO t VALUES(\$xf,$xf,2)"
db eval "INSERT INTO t VALUES($xf,$xf,3)"
db eval "INSERT INTO t VALUES(\$xf,\$xf,4)"

puts "\ndb eval \"CREATE TABLE t (a text, b real, c int)\"\n"
db eval {SELECT * FROM t} values {
            parray values
                puts ""
        }

db close

--------------------------------------------------------------------
FreeBSD 9.1-RELEASE #0 r243826: Tue Dec  4 06:55:39 UTC 2012
r...@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
tcl-8.6.0

set tcl_precision 15

platform: freebsd-ix86
sqlite version: 3.7.15.1

xf = 4.40035364203127786031058909193863e+118
x  = 4.400353642031278e+118

xf = 4.400353642031277860310589091938627241607447857305708019118800e+118
x  = 4.400353642031277860310589091938627241607447857305708019118800e+118

db eval "SELECT $xf=\$x" : 0
expr { $xf == $x }       : 1

db eval "SELECT $xf"  = 4.40035364203128e+118
db eval "SELECT \$xf" = 4.40035364203128e+118
db eval "SELECT \$x"  = 4.40035364203128e+118

db eval "CREATE TABLE t (a text, b real, c int)"

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.40035364203128e+118
values(c) = 1

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.40035364203128e+118
values(c) = 2

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.40035364203128e+118
values(c) = 3

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.40035364203128e+118
values(c) = 4

--------------------------------------------------------------------
FreeBSD 9.1-RELEASE #0 r243826: Tue Dec  4 06:55:39 UTC 2012
r...@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
tcl-8.6.0

set tcl_precision 14

platform: freebsd-ix86
sqlite version: 3.7.15.1

xf = 4.40035364203127786031058909193863e+118
x  = 4.400353642031278e+118

xf = 4.400353642031277860310589091938627241607447857305708019118800e+118
x  = 4.400353642031277860310589091938627241607447857305708019118800e+118

db eval "SELECT $xf=\$x" : 0
expr { $xf == $x }       : 1

db eval "SELECT $xf"  = 4.4003536420313e+118
db eval "SELECT \$xf" = 4.4003536420313e+118
db eval "SELECT \$x"  = 4.4003536420313e+118

db eval "CREATE TABLE t (a text, b real, c int)"

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.4003536420313e+118
values(c) = 1

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.4003536420313e+118
values(c) = 2

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.4003536420313e+118
values(c) = 3

values(*) = a b c
values(a) = 4.40035364203128e+118
values(b) = 4.4003536420313e+118
values(c) = 4

--------------------------------------------------------------------

On Fri, Mar 8, 2013 at 3:24 PM, Pavel Volkov <pavelivol...@gmail.com> wrote:
> Excuse me, the test (test/atof1.test) of sqlite3 distribution, of
> course. It is guilty?
> Or tcl real to text conversation? Why only on the platform x32.
> Thanks.
>
> On Fri, Mar 8, 2013 at 3:10 PM, Richard Hipp <d...@sqlite.org> wrote:
>> On Fri, Mar 8, 2013 at 6:00 AM, Pavel Volkov <pavelivol...@gmail.com> wrote:
>>
>>> And more tests. Perhaps one of the problems in converting real -> text?
>>>
>>
>> Binary to decimal conversion is *the* problem.  TCL uses an infinite
>> precision integer math library to do exact binary to decimal conversion.
>> SQLite does not have access to such a library and so exact integer to
>> decimal conversion is beyond its reach.
>>
>> I repeat:  SQLite stores and retrieves IEEE floating point values with
>> perfect accuracy.  But it only does binary to decimal conversion of IEEE
>> floating point numbers with 14 or 15 digits of accuracy.  If you need more
>> accuracy than this, use SQLite only for storage and use a different library
>> for your binary to decimal conversion.
>>
>>
>>
>> --
>> D. Richard Hipp
>> d...@sqlite.org
>> _______________________________________________
>> 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