точность вычислений....

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

точность вычислений....

Сообщение aaa3d » 18 апр 2007, 15:29

FB CS 1.53 linux, windows

такой вот запрос

select 4.5*0.95, 4.5*(1-0.05) from rdb$database

дает такой вот результат результат:
(если в эксперте поставить большую точность при выводе float полей)
F_1 F_2
4.275000000000000360000 4,274999999999999470000

конечно, формат double имеет ограничение, но почему число разное???
если я его дальше передаю в UDF, которая его округляет до 2 знаков, получаю 2 разных числа: 4,28 и 4,27.
вот такая бяка.... кто нибудь сталкивался? как победить?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 18 апр 2007, 16:09

Что-то ты не договариваешь... Откуда там плавающая точка? Первый диалект?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 18 апр 2007, 16:16

Выполни этот же запрос в isql заодно

Код: Выделить всё

SQL> SELECT 4.5*0.95, 4.5*(1-0.05) FROM RDB$DATABASE ;

               MULTIPLY                MULTIPLY
======================= =======================
      4.275000000000000       4.275000000000000
Похоже, ИБЕ тебе даёт несколько больше, чем 15 знаков после запятой (вас обманули - вам дали больше (с) :lol: )

PS на будущее - почему ты решил, что 1-0.05 == 0.95 ?

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 18 апр 2007, 16:16

да, диалект первый.
просто в базе которую поддерживаю в одних местах
идет расчет по первой схеме, а в других - по второй.
соответственно теряются копейки блин

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 апр 2007, 16:23

Перепиши UDF, там округление неправильное, не учитывает особенностей double.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 18 апр 2007, 16:50

PS на будущее - почему ты решил, что 1-0.05 == 0.95 ?
было такое подозрение, довольно сильное.

удфку переписывать неохота...


вот так нифига себе :( блин.... ну и засада

select 4.5*0.95*1E5, 4.5*(1-0.05)*1E5, 0.95*1e5, (1-0.05)*1e5 from rdb$database

результат

427500.000000000058 427499.999999999942 95000 95000

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 апр 2007, 17:39

aaa3d писал(а):удфку переписывать неохота...
Тогда посредством CAST округляй.

Ответить