Ещё раз про NormalizeDouble

 

Уже много раз писалось про NormalizeDouble, но тем не менее вопросов при применении указанной функции не становится меньше. Думаю что это происходит от того, что в документации к MQL4 об этой функции сказано очень скудно. Есть предложение к разработчикам дополнить и сделать более подробным описание этой функции. Интересует полный перечень тех случаев ( после каких математических вычислений ) когда необходимо нормализовать значение. Например: надо ли нормализовать произведение double на int, или частное от деления int на double, или сумму double и double, ну и так далее... Великолепно если бы подобную информацию представили в виде таблицы, где в первой колонке по строкам были бы указаны виды мат. операций, в первых двух колонках возможные сочетания типов операндов, а в третьей колонке была бы указана "+" и "-" необходимость нормализовать результат такой операции. А то складывается впечатление, что нормализовать надо результат любой операции, и весь советник настолько пестрит NormalizeDouble, что становится невыносимо трудно чидать код советника. Уважаемые разработчики, пожалуйста проясните ситуацию.

 
NormalizeDouble нужно лишь при торговых операциях открытия/модификации ордеров OrderSend / OrderModify. Она как раз именно для этого и была введена в язык. В остальных случаях её использование абсолютно лишнее - всегда можно обойтись и без неё. 
 
solandr писал (а):
NormalizeDouble нужно лишь при торговых операциях открытия/модификации ордеров OrderSend / OrderModify. Она как раз именно для этого и была введена в язык. В остальных случаях её использование абсолютно лишнее - всегда можно обойтись и без неё.
Бред какой-то. Зачем тогда https://www.mql5.com/ru/forum/48755 ?
 
vendim писал (а):
solandr писал (а):
NormalizeDouble нужно лишь при торговых операциях открытия/модификации ордеров OrderSend / OrderModify. Она как раз именно для этого и была введена в язык. В остальных случаях её использование абсолютно лишнее - всегда можно обойтись и без неё.
Бред какой-то. Зачем тогда https://www.mql5.com/ru/forum/48755 ?

Ну почему же бред? Приведённая ветка даёт исчерпывающий ответ на тему этого топика:
******************
Mak 08.06.05 15:41
Проверять вещественные числа на равенство всегда некорректно (за очень редким исключением).

Равенство можно проверить только с некоторой точностью.
И сделать это можно только так

MathAbs(X-Y) < precision
**********************
Что никак не противоречит с моим ответом. Плюс к этому я ещё точно указал где использование функции NormalizeDouble уместно, удобно и полностью оправданно.
Ну а уж дело сугубо личное - воспользоваться этим ответом, или же продолжать долбиться об бетонную стенку головою кому-то что-то доказывая насчёт того что должен и что не должен позволять тип double после нормализации! ;o).

 

Дело не в точности. А в том, что что математические операции с нормализованными и ненормализованными операндами дают совершенно рядом не стоящие результаты.
Цитата из доки:

int    i = 1 / 2;     // приведения типов нет, результат: 0
int    i = 1 / 2.0;   // выражение приводится к типу double, затем приводится к целевому типу int, результат: 0
double d = 1.0 / 2.0; // приведения типов нет, результат: 0.5
double d = 1 / 2.0;   // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5
double d = 1 / 2;     // выражение типа int приводится к целевому типу double, результат: 0.0


А что бывает в результате других операций?

 
Видимо мы с вами говорим на разных языках. Вы предлагаете разработчикам подумать над решением не такой уж простой задачи.
Я говорю, что при рациональном программировании данная задача возникнуть не может и даю рекомендации о том когда следует применять нормализацию. Но вас этот ответ не устраивает и вы хотите, чтобы было решение именно вашей искуственно поставленной задачи.
Хотя ответ, который я предложил в самом начале является многократно проверенным и не только мной одним.
При ВСЕХ вычислениях в экперте используем тип double, результат вычислений с которым описан в приведённой вами документации.
При необходимости послать/модифицировать ордер ВСЕ значения в этом ордере нормализуем.
Соответственно нормализации подлежат лишь ТЕ значения, которые отправляюься на сервер для работы с ордерами! Зачем вам нужно знать результат каких-то там операций с нормализованными вещественными?
 
vendim:

Дело не в точности. А в том, что что математические операции с нормализованными и ненормализованными операндами дают совершенно рядом не стоящие результаты.
Цитата из доки:

int    i = 1 / 2;     // приведения типов нет, результат: 0
int i = 1 / 2.0; // выражение приводится к типу double, затем приводится к целевому типу int, результат: 0
double d = 1.0 / 2.0; // приведения типов нет, результат: 0.5
double d = 1 / 2.0; // выражение приводится к типу double, который совпадает с целевым типом, результат: 0.5
double d = 1 / 2; // выражение типа int приводится к целевому типу double, результат: 0.0


А что бывает в результате других операций?

Мне кажется вы путаете понятия нормализации и вещественные числа.
Ваш пример из доки к нормализации и NormalizeDouble абсолютно никакого отношения не имеет.
Это пример приведения типов используемое в MQL4.
Причина обращения: