Re: Floating point error

From: Tom Duffey <tduffey(at)trillitech(dot)com>
To: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
Cc: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: Floating point error
Date: 2013-02-25 14:08:57
Message-ID: 6828194A-8726-453A-9FF8-A17EACECCE62@trillitech.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

That's exactly what I was looking for. We use COPY to transfer data from a 1 billion+ row table to a test database and were confused why the results looked the same but were obviously not. Sounds like we need to use the extra_float_digits setting to include all the available information when transferring the data.

Thanks for the explanation.

Tom

On Feb 25, 2013, at 8:00 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at> wrote:

> Tom Duffey wrote:
>> Here is a smaller test case that does not involve Java. I guess this probably is just due to floating
>> point error when the initial value is inserted that is too large for the field but it's still a
>> surprise.
>>
>> Create a test table, insert a couple values and view the results:
>>
>> CREATE TABLE test (
>> id INTEGER PRIMARY KEY,
>> value REAL NOT NULL
>> );
>>
>> INSERT INTO test (id, value) VALUES (1, 10.3884573), (2, 10.3885);
>> SELECT * FROM test;
>>
>> id | value
>> ----+---------
>> 1 | 10.3885
>> 2 | 10.3885
>> (2 rows)
>
> SET extra_float_digits=3;
> SELECT * FROM test;
>
> id | value
> ----+------------
> 1 | 10.3884573
> 2 | 10.3885002
> (2 rows)
>
> PostgreSQL by default omits the last three digits to avoid
> differences on different architectures (I think).
>
> When you convert to double precision, you'll see these digits.
>
>> At this point you would think you have two equal values. Now change the type:
>>
>> ALTER TABLE test ALTER COLUMN value TYPE DOUBLE PRECISION;
>> SELECT * FROM test;
>>
>> id | value
>> ----+------------------
>> 1 | 10.3884572982788
>> 2 | 10.388500213623
>> (2 rows)
>
> Yours,
> Laurenz Albe

--
Tom Duffey
tduffey(at)trillitech(dot)com
414-751-0600 x102

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Stefan Keller 2013-02-25 17:22:02 Reading an OUT parameter out of a function call
Previous Message Albe Laurenz 2013-02-25 14:00:03 Re: Floating point error

Browse pgsql-hackers by date

  From Date Subject
Next Message Stephen Frost 2013-02-25 14:11:27 Re: unified vs context diffs (was Re: Strange Windows problem, lock_timeout test request)
Previous Message Stephen Frost 2013-02-25 14:05:24 Re: Strange Windows problem, lock_timeout test request