Ошибки, баги, вопросы - страница 2820

 
Slava:

Тут есть ещё нюансы.

Вещественное число, умноженное на 0.5 может не сравниться с тем же числом, разделённым на 2.0

Все так. Но вопрос заключался в том, почему число 1.79435 не является нормализованным до 5-го знака после запятой?


ЗЫ Предыстория вопроса.

Сработал SL в Тестере. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0 (так принято в MT5), DEAL_COMMENT = "sl 1.79435".

Нужно было понять, было скольжение при исполнении SL или нет? Поэтому просто сравнил DEAL_PRICE и цену из комментария. Глазами вижу, что цены одинаковые, а MQL говорит, что нет. В итоге докопался до исходного сравнения.

 
fxsaber:

Все так. Но вопрос заключался в том, почему число 1.79435 не является нормализованным до 5-го знака после запятой?


ЗЫ Предыстория вопроса.

Сработал SL в Тестере. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0 (так принято в MT5), DEAL_COMMENT = "sl 1.79435".

Нужно было понять, было скольжение при исполнении SL или нет? Поэтому просто сравнил DEAL_PRICE и цену из комментария. Глазами вижу, что цены одинаковые, а MQL говорит, что нет. В итоге докопался до исходного сравнения.

Извините, но слышать это от вас как-то странно.


 
Alexey Viktorov:

Извините, но слышать это от вас как-то странно.

Повторяю свой вопрос.

fxsaber:

почему число 1.79435 не является нормализованным до 5-го знака после запятой?

void OnStart()
{
  const double Norm = NormalizeDouble(1.79435, 5);
  
  Print((double)(string)Norm == Norm);    // false
  Print((double)(string)Norm == 1.79435); // true
}
 
fxsaber:

Все так. Но вопрос заключался в том, почему число 1.79435 не является нормализованным до 5-го знака после запятой?

нормализация это не округление 

@Slava пишет о том, что внутренне представление double отличаются:

#define PRINT(EX) Print(#EX," = ",EX)
//+------------------------------------------------------------------+
void OnStart()
{
   union ULONG_DOUBLE
   {
      double d_value;
      ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble(1.79435, 5);
   double CONST_DOUBLE  = 1.79435;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex(const ulong value)
{
   return(StringFormat("%llX", value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) NORM_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DDA

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) CONST_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD9


ЗЫ: где то был хороший пост @Nikolai Semko , он очень качественно описал работу с double, может найду ссылку выложу

UPD: https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

 
Igor Makanu:

нормализация это не округление 

На пять с плюсом знаю теорию, как работать с double и прочее. Алгоритм NormalizeDouble содержит ошибку. Поднятая тема только косвенно касается сравнения даблов.

 
fxsaber:

Повторяю свой вопрос.

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

fxsaber:

На пять с плюсом знаю теорию, как работать с double и прочее. Алгоритм NormalizeDouble содержит ошибку. Поднятая тема только косвенно касается сравнения даблов.

Здесь точно без того объяснения Семко не обойтись.
 
NormalizeDouble - это просто определенный алгоритм, который применяется к double-числу. К сожалению, в нем ошибка. Если поправят, ошибка исчезнет. От этого double-представления всех остальных никак не поменяются.
 
fxsaber:

 Алгоритм NormalizeDouble содержит ошибку. 

да

кажется A100 писал об этом

но разработчики с момента появления MQL придерживаются этой "особенности", увы


fxsaber:
 Если поправят, ошибка исчезнет. 
думаю появятся другие баги и будет очень много шума )))
 
Igor Makanu:

думаю появятся другие баги и будет очень много шума )))

Не появятся, т.к. почти все сравнивают даже нормализованные даблы через нормализацию. Т.е. ставят ее куда попало.


Правильная нормализация всегда должна давать true в этом условии.

Это единственная проверка правильности нормализации. Если будет выдавать всегда true, то ничего сломаться не сможет.

 
fxsaber:
NormalizeDouble - это просто определенный алгоритм, который применяется к double-числу. К сожалению, в нем ошибка. Если поправят, ошибка исчезнет. От этого double-представления всех остальных никак не поменяются.
Да вроде тут дело не в функции, а в том, что константы не нормализуются компилятором (хотя следовало бы).
Это же касается и преобразования string в double.