Вопрос про сравнение типов double

 

Коллеги. Неделю как начал писать советников на mq4 и с удивлением обнаружил, что в нем нельзя сравнивать типы double (причем уже написал пару советников, которые успешно работают). Вопрос - что совсем нельзя?

Например вот такие вещи:

double dd = 0;
if ( dd == 0 ) ...

или

if ( OrderClosePrice() == OrderTakeProfit() ) ...

или

double dd2 = dd + 0.2;
if ( dd2 == dd + 0.2 ) ...

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

 

Можно оба числа нормализовать и их сравнивать, но если вычислять разницу, то потребуется одна нормализация - экономия.

 

Еще можно сравнивать разность с DBL_EPSILON, то есть вообще без нормализации обходиться. Если же сравнивать нужно цены или объемы, то и DBL_EPSILON не нужен - берется половина от пункта.

 
double epsilon=0.0000001;

if(MathAbs(a-b)>epsilon) 
   //числа не равны
 

Спасибо Коллеги. Очень информативно. Написал функцию сравнение через нормализованную разницу, но последний предложенный способ мне понравился больше. Мне кажется он более надежным.

Два часа сегодня потратил, прежде чем вкурил, почему if на неравенство проходит, хотя числа были равны. Зная штук 15 разных языков программирования с таким столкнулся впервые. 

 
Reactor555:

Спасибо Коллеги. Очень информативно. Написал функцию сравнение через нормализованную разницу, но последний предложенный способ мне понравился больше. Мне кажется он более надежным.

Два часа сегодня потратил, прежде чем вкурил, почему if на неравенство проходит, хотя числа были равны. Зная штук 15 разных языков программирования с таким столкнулся впервые. 


Проблема не в языке программирования, а в точке его практического приложения к жизненной ситуации. В нашей жизни пока еще сравнительно мало отраслей, в которых требуется высокая точность численных величин (но это будет изменяться со временем). А потому с вещественными числами сталкиваемся редко и можем даже не замечать ошибок. Имея же дело с ценами, которые являются вещественными, получаем довольно высокую точность, где пять знаков после запятой существенны.

 

Об этой задаче в хелпе написано:

https://www.mql5.com/ru/docs/basis/types/double

И здесь приведен очень выразительный пример.

Хорошей Вам написать программы!

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5