Правила приведения типов или представление действительных чисел - как понять?

 

Всем привет. есть такой код:

1 вариант.

int start()
{
int delta;

delta=(1.0548-1.0541)/Point;


Comment(delta);
return(0);

}

Результат:delta = 6.

По правилам -

  • если в выражении содержатся операнды разных типов, то тип выражения преобразовывается в тип, имеющий более высокий приоритет; типы int, bool, color и datetime имеют одинаковый приоритет, тип double - более высокий приоритет, тип string - самый высокий приоритет;
  • если тип выражения справа от знака операции присвоения не совпадает с типом переменной слева от знака операции присвоения, то значение выражения приводится к типу переменной слева от знака операции присвоения; это называется приведением к целевому типу;

Должно быть delta = 7.

2 вариант.

Если изменить тип delta на double то результат будет верным delta = 7.

3 вариант.

iint start()
{
int delta;

delta=NormalizeDouble((1.0548-1.0541)/Point,Digits);


Comment(delta);
return(0);
}

Результат:delta = 7.

Т.е. мы нормализавали всё выражение.

4 вариант.

Если мы нормализуем не всё выражение а часть delta=NormalizeDouble(1.0548-1.0541,Digits)/Point, то результат тоже верен delta = 7.

Т.е для верного результата необходимо нормализовать только вычитание 1.0548-1.0541. или нужно нормализовывать любые вычисления с действительными числами?

Конец.

Я конечно не программист, но предположу - числа в памяти например 1.0548 хранится не так 1.0548000000000000...., а с каким то

мусором - 1.05480636346779...., может по этому и получается на единицу меньше.

 
Константа не должна быть с мусором.
 
Zhunko:
Константа не должна быть с мусором.

Так зачем тогда нормализация? - для простого округления чисел?


Если дальше есть мусор то она должна округлить так 1.05488636346779 -

1.0549.

Или нормализация нужна для тех процессов которые происходят при вычислениях над действительными числами?


Нормализация нужна для округления до Digits при торговле, а в этих случаях как?

 
jeronimo:

Так зачем тогда нормализация? - для простого округления чисел?


Если дальше есть мусор то она должна округлить так 1.05488636346779 -

1.0549.

Или нормализация нужна для тех процессов которые происходять при вычислениях над действительными числами?


А если не 1.05488636346779 а вовсе даже 1.05480636346779?

А так всё просто, если дельта типа интежер и значение чисто случайно было 1.05480-1.05411, то естественно было получить 10548.0-10541.1=6,9 (а так как дельта интежер то дельта = 6).

 
evillive:

А если не 1.05488636346779 а вовсе даже 1.05480636346779?

А так всё просто, если дельта типа интежер и значение чисто случайно было 1.05480-1.05411, то естественно было получить 10548.0-10541.1=6,9 (а так как дельта интежер то дельта = 6).


Если такой случай то да и нормализация всё делает верно - округляет с 0,00069 до 0,0007, но если 1.05488-1.05411 то .....
 
evillive:

А если не 1.05488636346779 а вовсе даже 1.05480636346779?

А так всё просто, если дельта типа интежер и значение чисто случайно было 1.05480-1.05411, то естественно было получить 10548.0-10541.1=6,9 (а так как дельта интежер то дельта = 6).


Получается так всегда.
 
jeronimo:

Если такой случай то да и нормализация всё делает верно - округляет с 0,00069 до 0,0007, но если 1.05488-1.05411 то .....

Не, если так, то целочисленное дельта должно было быть 7. Но так как в коде были заданы значения с точностью до 4 знака, то о 5 знаке можно спорить до хрипоты, а всё равно задавать дельту лучше дабл и нормализовать её надо обязательно )))
 
evillive:

Не, если так, то целочисленное дельта должно было быть 7. Но так как в коде были заданы значения с точностью до 4 знака, то о 5 знаке можно спорить до хрипоты, а всё равно задавать дельту лучше дабл и нормализовать её надо обязательно )))

А я и не спорю, просто я такой человек - запоминаю только то что понимаю. Это не понятно.


Добится верного результата одно, а понять - другое.

 
jeronimo:

Добится верного результата одно, а понять - другое.

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


о_О.... либо вообще бросить эти бесполезные попытки... :-)))

нормализовать то, что вроде как и так по логике должно нормализоваться само собой... :-)))

 

А округлять можно как угодно :)

Вроде, говорили, что в пятерке это дело исправлено...

Причина обращения: