|
|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : RAD 2:5020/400 09 Feb 2001 21:02:24 To : All Subject : PostgreSQL: SUM(float8) bug -------------------------------------------------------------------------------- Hi ! Помогите, пожалуйста, разобраться где теряется точность при суммировании. Проблема возникает при суммирование большого кол-ва чисел с разным порядком. Вот, собственно, пример: db=> CREATE TABLE t4 (f float4); db=> CREATE TABLE t8 (f float8); db=> INSERT INTO t4 VALUES (0.123456); db=> INSERT INTO t4 VALUES (4031); db=> INSERT INTO t8 VALUES (0.123456); db=> INSERT INTO t8 VALUES (4031); db=> SELECT SUM(f) FROM t4; sum ------- 4301.12 -- здесь понятно, это из-за округления (у float4 6 decimal places) db=> SELECT SUM(f::float8) FROM t4; sum ---------------- 4301.12345600128 ^^^ -- а здесь из-за чего ошибка в младших разрядах? Дальше ещё один "фокус": db=> INSERT INTO t8 SELECT * FROM t8; INSERT 0 2 db=> INSERT INTO t8 SELECT * FROM t8; INSERT 0 4 db=> INSERT INTO t8 SELECT * FROM t8; INSERT 0 8 ..... db=> INSERT INTO t8 SELECT * FROM t8; INSERT 0 131072 db=> SELECT SUM(f) FROM t8; sum ---------------- 528367413.624994 -- хотя здесь должно быть 131072 * (4031 + 0.123456) = 528367412.624832 (ошибка опять в младших трёх разрядах!) Bug Postgres'a для типа float8 ? Есть какие-нибудь способы вылечить/обойти это ? Заранее спасибо Даутханов Руслан rd@krs.ru --- ifmail v.2.15dev5 * Origin: Rostelecom JSC (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/17299bcaab371.html, оценка из 5, голосов 10
|