Re: [HACKERS] casts: max double precision text double precision fails with out or range error

2011-01-11 Thread Alvaro Herrera
Excerpts from Maciej Sakrejda's message of mar ene 11 03:28:13 -0300 2011:
 Tried asking this in pgsql-general but I got no response, so I thought
 I'd give hackers a shot:
 
 postgres=# select (((1.7976931348623157081e+308)::double
 precision)::text)::double precision;
 ERROR:  1.79769313486232e+308 is out of range for type double precision
 
 I'm working on a pg driver and in my float data decoder functional
 tests, I ran into some errors that I eventually traced back to this
 behavior. Essentially, postgres seems to cast the max normal double
 (i.e., the bits of ~(1ULL52 | 1ULL63)) to text in such a manner
 that it's rounded up, and the reverse cast, text-to-double-precision,
 does not recognize it as being in range. Curiously, pg_dump seems to
 print doubles with more precision (in both COPY and INSERT modes),
 avoiding this issue.

Yeah, it sets the extra_float_digits parameter.

alvherre=# set extra_float_digits to 3;
SET
alvherre=# select (((1.7976931348623157081e+308)::double 
precision)::text)::double precision;
  float8  
──
 1.79769313486231571e+308
(1 fila)

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] casts: max double precision text double precision fails with out or range error

2011-01-10 Thread Maciej Sakrejda
Tried asking this in pgsql-general but I got no response, so I thought
I'd give hackers a shot:

postgres=# select (((1.7976931348623157081e+308)::double
precision)::text)::double precision;
ERROR:  1.79769313486232e+308 is out of range for type double precision

I'm working on a pg driver and in my float data decoder functional
tests, I ran into some errors that I eventually traced back to this
behavior. Essentially, postgres seems to cast the max normal double
(i.e., the bits of ~(1ULL52 | 1ULL63)) to text in such a manner
that it's rounded up, and the reverse cast, text-to-double-precision,
does not recognize it as being in range. Curiously, pg_dump seems to
print doubles with more precision (in both COPY and INSERT modes),
avoiding this issue. Of course I'm not expecting perfect precision in
round-tripping doubles like this (this is always dicey with IEEE
floating point anyway), but failing outright is a little ugly. Any
thoughts? Version is PostgreSQL 8.4.6 on i486-pc-linux-gnu, compiled
by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit.

Also, although the simplest way to illustrate this problem is with
this round-trip set of casts, that's obviously a contrived use case.
However, given that the same behavior is seen in the TEXT mode output
for doubles of the FEBE protocol, I think it's a little more
noteworthy.

Thanks,
Maciek Sakrejda

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers