Tom Lane wrote:

Andreas Pflug <[EMAIL PROTECTED]> writes:


Well, to me it's not well-known that floating-point addition is not associative, do I need to re-learn my math?



regression=# select (1.0::float8 + (-1.0::float8)) + 1.0e-20::float8; ?column? ---------- 1e-20 (1 row)

regression=# select 1.0::float8 + ((-1.0::float8) + 1.0e-20::float8);
?column?
----------
       0
(1 row)




Hi Tom,


I already suspected an example like this. Obviously in a pure math world, the second example is wrong, caused by implicite rounding. Fortunately, if omitting the float8 casts numeric is used, delivering ultimate precision.

Just for curiousity: on MSSQL2000, the first will deliver 9.99999999999995E-21, and if the type decimal(30,25) is used both give 0.00000000000. Even better, CAST( CAST(1E-20 AS DECIMAL(30,25) AS FLOAT) is 0.0 :->

Oracle 9.2 will calculate correctly with float down to 1.0e-40.

Regards,
Andreas


---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives?

http://archives.postgresql.org

Reply via email to