Re: BUG #14046: Bad mathematical rules for 0 cast

From: Jarosław Stokłosa <jaroslaw(dot)stoklosa(at)nomino(dot)pl>
To: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
Cc: John McKown <john(dot)archie(dot)mckown(at)gmail(dot)com>, "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: BUG #14046: Bad mathematical rules for 0 cast
Date: 2016-03-31 07:59:50
Message-ID: 56FCD8F6.8090805@nomino.pl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

W dniu 30/03/2016 o 18:03, David G. Johnston pisze:
> On Tue, Mar 29, 2016 at 11:55 PM, Jarosław Stokłosa
> <jaroslaw(dot)stoklosa(at)nomino(dot)pl <mailto:jaroslaw(dot)stoklosa(at)nomino(dot)pl>>wrote:
>
>
> W dniu 25/03/2016 o 14:32, John McKown pisze:
>> On Fri, Mar 25, 2016 at 3:56 AM, <jaroslaw(dot)stoklosa(at)nomino(dot)pl
>> <mailto:jaroslaw(dot)stoklosa(at)nomino(dot)pl>>wrote:
>>
>> The following bug has been logged on the website:
>>
>> Bug reference: 14046
>> Logged by: Jarosław Stokłosa
>> Email address: jaroslaw(dot)stoklosa(at)nomino(dot)pl
>> <mailto:jaroslaw(dot)stoklosa(at)nomino(dot)pl>
>> PostgreSQL version: 9.4.5
>> Operating system: x86_64-redhat-linux-gnu
>> Description:
>>
>> Below query should return 2 times TRUE.
>>
>> SELECT cast('+0' as FLOAT) = cast('-0' as FLOAT), cast('+0'
>> as FLOAT)::TEXT
>> = cast('-0' as FLOAT)::TEXT
>>
>> +0 and -0 should be casted to +0 or 0.
>>
>
> ​How would you propose to implement this "or"?​
>

I propose for TEXT cast '-0'::FLOAT and '+0'::FLOAT to '0'::TEXT - like
'-0'::NUMERIC::TEXT, '+0'::NUMERIC::TEXT

>>
>> ​ I humbly disagree with you. PostgreSQL use IEEE 754 for
>> floating point (mainly because that is what most - not all -
>> computers today use). IEEE 754 distinguishes +0 (or just 0) from
>> -0. cast('-0' as FLOAT) results in an IEEE 754 negative zero.
>> Which is not identically equal to a positive zero. The case to
>> TEXT should, and does, preserve this non-identical difference. ​
>
> I'm disagee with you. PostgreSQL don't distinguish +0 from -0
> because cast('+0' as FLOAT) = cast('-0' as FLOAT) equals to TRUE.
> This is math rules. So case to float then to text shoud, and
> doesn't, preserve the equality. IEEE754 describes storage numbers
> in computer's memory but doesn't turn off math comparation rules.
>
>
> Agreed. It is the cast to text turns off math comparison rules.
>
>
I understand, that convert to text can produce trouble with comparation
- Tom Lane give example in this thread, but in this case IEEE 754
doesn't prohibit to show zero without sign. NUMERIC is an example.

Regards
Jarek Stokłosa

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Srivathson KK 2016-03-31 09:59:50 Re: BUG #14047: Problem while initdb - 0xC000001D
Previous Message Jarosław Stokłosa 2016-03-31 07:49:00 Re: BUG #14046: Bad mathematical rules for 0 cast