From: | Maciej Sakrejda <m(dot)sakrejda(at)gmail(dot)com> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | casts: max double precision > text > double precision fails with out or range error |
Date: | 2011-01-11 06:28:13 |
Message-ID: | AANLkTim5iE0rbRyJqQKeC=mNbV4a7BH8=zASiLAW+hrC@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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 ~(1ULL<<52 | 1ULL<<63)) 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
From | Date | Subject | |
---|---|---|---|
Next Message | Tatsuo Ishii | 2011-01-11 06:30:26 | Re: Error code for "terminating connection due to conflict with recovery" |
Previous Message | Pavel Stehule | 2011-01-11 05:02:40 | Re: Compatibility GUC for serializable |