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

 
Kira27:

Справка ввела меня в ступор)))  

В справке написано без кавычек. Так-что вы сами ввели себя туда.

 
Бородатый вопрос. Но не понимаю такого результата.
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
Бородатый вопрос. Но не понимаю такого результата.

100 раз было сказано: "не используйте точное сравнение даблов, а используйте эпсилон". В том числе в нашей документации.

Даже 0.3 или 0.7 не сравнятся со своими представлениями. Примите и смиритесь. Или идите и учитесь (в MTI, например)

 
Slava:

100 раз было сказано: "не используйте точное сравнение даблов, а используйте эпсилон". В том числе в нашей документации.

Сравнение даблов делать умею, конечно.

Даже 0.3 или 0.7 не сравнятся со своими представлениями. Примите и смиритесь. Или идите и учитесь (в MTI, например)

Print(NormalizeDouble(0.3, 5) == 0.3); // true
Print(NormalizeDouble(0.7, 5) == 0.7); // true

Print(NormalizeDouble(0.12345, 5) == 0.12345); // true

Вы не поняли вопроса.

 
decimal мог бы упростить задачу, но он медленный(
 
fxsaber:

Сравнение даблов делать умею, конечно.

Вы не поняли вопроса.

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

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

 
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

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