проблема округления

Запросы, планы, оптимизация запросов, ...

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 дек 2006, 14:42

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 06 дек 2006, 16:13

Ещё раз попрошу птичку нашу не обижать. Я с этими инт-базед нумериками сам-то избегаю связываться, но счас поисследовал вопрос с учётом исправления путаницы со значениями PROC_STO и PRICE_K в исходном посте, и возникли сомнения.

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

Create Procedure Atomuliadalato
Returns (Temp Numeric (15,2), S SmallInt, N92 Numeric (9,2), N95 Numeric (9,5), D Numeric (15,2))
As
Declare Variable M3 Numeric (9,2);
Declare Variable STO Smallint;
Declare Variable  days Smallint;
Declare Variable  hours Smallint;
Declare Variable  PROC_STO Numeric(9,2);
Declare Variable  PRICE_K Numeric(9,5);
Begin
   M3=1.22;
   STO=1;
   days=31;
   hours=8;
   PROC_STO=1.00;
   PRICE_K=1.11666;
   S=STO*Days;
   Suspend;
   S=S*hours;
   Suspend;
   N92=S*M3;
   Suspend;
   N92=N92*PROC_STO;
   Suspend;
   N95=N92*PRICE_K;
   Suspend;
   D=N95;
   temp=STO*days*hours*M3*PROC_STO*PRICE_K;
   Suspend;
   temp=null; S=Null; N92=Null; N95=Null; D=Null;
   Suspend;
   S=STO*Days;
   Suspend;
   S=S*hours;
   Suspend;
   N92=S*M3;
   Suspend;
   N95=N92*PRICE_K;
   Suspend;
   N92=N95*PROC_STO;
   D=N92;
   Suspend;
   temp=STO*days*hours*M3*PRICE_K*PROC_STO;
   Suspend;
End

Work Committed
select * from Atomuliadalato

                  TEMP      S         N92         N95                      D 
=========== ====== =========== =========== 

                <null>     31      <null>      <null>                 <null> 
                <null>    248      <null>      <null>                 <null> 
                <null>    248      302.56      <null>                 <null> 
                <null>    248      302.56      <null>                 <null> 
                <null>    248      302.56   337.85665                 <null> 
                337.86    248      302.56   337.85665                 337.86 
                <null> <null>      <null>      <null>                 <null> 
                <null>     31      <null>      <null>                 <null> 
                <null>    248      <null>      <null>                 <null> 
                <null>    248      302.56      <null>                 <null> 
                <null>    248      302.56   337.85665                 <null> 
                <null>    248      337.86   337.85665                 337.86 
                338.00    248      337.86   337.85665                 337.86 


Сдаёццо, что фигня-то имеет место быть при пхании этих инт-базед в дабл-базед в последний момент, причём только в недрах арифмометра. Тогда бага. Или вообще что-то с последовательностью выполнения операций и последний промежуточный результат оказывается в смаллинте. Насчёт того что в FB1.5 работало - это художественный свист, именно на ём и проделал.

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

Сообщение hvlad » 06 дек 2006, 16:35

Merlin писал(а):Сдаёццо, что фигня-то имеет место быть при пхании этих инт-базед в дабл-базед в последний момент, причём только в недрах арифмометра. Тогда бага. Или вообще что-то с последовательностью выполнения операций и последний промежуточный результат оказывается в смаллинте. Насчёт того что в FB1.5 работало - это художественный свист, именно на ём и проделал.
Попробуй вычислять справа на лево. Я сейчас не могу проверить

Dedal
Сообщения: 26
Зарегистрирован: 11 янв 2006, 13:35

Сообщение Dedal » 06 дек 2006, 17:15

это художественный свист, именно на ём и проделал.
Спорить не буду, раньше значение 1,11666 было равно 1,12, а потому глюки не встречались. Переход на версию 2,0 совпал со сменой значения на 1,11666, но это не меняет факта присутствия странного поведения птички.
Попробуй вычислять справа на лево. Я сейчас не могу проверить
Справа на лево все считает правильно, но откудово мне знать что в птичке результат зависит от перестановки операндов.

Не подумайте что грешу на птичку. Я всема руками и ногами буду бить тех кто обижает ее, но все таки хочетса быть застрахованым от таких сюрпризов.

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

Сообщение hvlad » 06 дек 2006, 17:54

Dedal писал(а):
это художественный свист, именно на ём и проделал.
Спорить не буду, раньше значение 1,11666 было равно 1,12, а потому глюки не встречались. Переход на версию 2,0 совпал со сменой значения на 1,11666, но это не меняет факта присутствия странного поведения птички.
Попробуй вычислять справа на лево. Я сейчас не могу проверить
Справа на лево все считает правильно, но откудово мне знать что в птичке результат зависит от перестановки операндов.

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

Dedal
Сообщения: 26
Зарегистрирован: 11 янв 2006, 13:35

Сообщение Dedal » 07 дек 2006, 09:58

не городить десятки вычислений в одной строке
Где написано про такое ограничение? Я что должен сам догадываться?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 дек 2006, 12:39

Где написано про такое ограничение? Я что должен сам догадываться?
не написано, и есть подозрения на багус, поэтому изложенное суть РЕКОМЕНДАЦИИ.

Ответить