Сравнение вещественных чисел

 
Уважаемые разработчики!

Ответьте, пожалуйста, на такой вопрос. Корректно ли проверять равенство двух чисел типа double после их нормализации функцией NormalizeDouble до одинакового количества знаков после запятой?

Дело в том, что функция, приводящая оба числа к целому виду перед сравнением, которая используется у меня в эксперте, занимает довольно много процессорного времени. Хотелось бы сделать максимально быстро, но правильно. Что посоветуете?

Конечно, при каждом тике в реал-тайме это малозаметно. Но тестер начинает довольно долго рассчитывать при моделировании. Хочется писать как можно более грамотнее. Так мне приятнее как программисту.

Очень надеюсь на ответ!
 
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Всё предельно ясно!

Спасибо!
 
Renat писал (а) >>
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

Значит ли это, что вместо цифры 8 в NormalizeDouble можно указать встроенную переменную Digits, привязав тем самым точность вычисления к используемой валютной паре?


Например так:

bool Equal(double FirstValue, double SecondValue) {
    if (NormalizeDouble(FirstValue - SecondValue, Digits) == 0) {
        return(true);
    } else {
        return(false);
    }
}

Смогу ли я с помощью этой функции сравнивать к примеру StopLoss разных ордеров, и при этом забыв о разрядности различных валютных пар?

 

Я тут немного развил тему... пригодно ли это для использования?


bool Equal(double FirstValue, double SecondValue) {
    if (NormalizeDouble(FirstValue - SecondValue, Digits) == 0) {
        return(true);
    } else {
        return(false);
    }
}
 
bool LessOrEqual(double FirstValue, double SecondValue) {
    if ((FirstValue < SecondValue) || Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool GreaterOrEqual(double FirstValue, double SecondValue) {
    if ((FirstValue > SecondValue) || Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool Less(double FirstValue, double SecondValue) {
    if ((FirstValue < SecondValue) && !Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool Greater(double FirstValue, double SecondValue) {
    if ((FirstValue > SecondValue) && !Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}