Может ли цена != цена ? - страница 3

 
WHRoeder:
Много вычислений вместо простого решения
Простое или нет решение определяется кодом, в котором оно должно быть реализовано...
 
RaptorUK:

Я пришел к такому решению, которое превращает двойники в инты для сравнения двойников. . .

Я тоже придумал креативное решение, которое работает для меня (до сих пор) для сравнения цен:

int ConvertToPoints (double _price) {
   double price_double = _price / Point;
   int price_int = MathRound(price_double);
      
   return (price_int);
}

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

ConvertToPoints(price) != ConvertToPoints(price)

не может быть правдой.

 
CompareDoubles() из stdlib.mq4 дисквалифицируется из этого обсуждения? Она хорошо работает для меня, если используется для определения цены.
 
Ovo:
CompareDoubles() из stdlib.mq4 дисквалифицируется из этого обсуждения? Она хорошо работает для меня, если используется для цены.
Дисквалифицирован? Нет, но все, что он делает, это сравнение на равенство.
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

Плавающее деление, плавающее сложение, преобразование в int, вызов функции (копирование, переход, возврат = 3,) * 2 все умножается на два. (18) И это при условии, что деление и преобразование находятся на одном уровне с другими операциями - это не так.

против

if (MathAbs(a - b) > Point / 2.)

одно вычитание, один тест, 1/2 отрицания (в среднем) и сравнение. (3 1/2, если point/2 выполняется в init, а ABS заменяется IF).

Не усложняйте слишком сильно

Может сработать при равенстве из-за округления
if (a > b)
a определенно больше b
if (a - b > Point / 2.)
Может сработать, когда a меньше b из-за округления
if (a >= b)
a определенно >= b
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
Сработает при любой ошибке округления
if (a != b)
Определенно не равно
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

Плавающее деление, плавающее сложение, преобразование в int, вызов функции (копирование, прыжок, возврат = 3,) * 2 все умножить на два. (18) И это при условии, что деление и преобразование выполняются наравне с другими операциями - это не так.

против

одно вычитание, один тест, 1/2 отрицания (в среднем) и сравнение. (3 1/2, если point/2 выполняется в init, а ABS заменяется IF).

Не усложняйте ситуацию

2013.04.03 17:39:12 TestSpeed-CompareDbls USDJPY,M5: MathAbs(a - b) 9000000 раз за 266 мс.


2013.04.03 17:39:11 TestSpeed-CompareDbls USDJPY,M5: ConvertToPoints 9000000 раз за 1887 мс.

2013.04.03 17:46:02 TestSpeed-CompareDbls USDJPY,M5: Flat(price) 9000000 раз за 3604 мс.

Метод "MathAbs(a-b)" примерно в 7 раз быстрее метода ConvertToPoints() и почти в 14 раз быстрее моего метода "Flat()".

 
К сведению, в MQL5 можно перегружать стандартные операторы, что позволяет реализовывать очень элегантные решения.
 
Я протестировал (intRecord > price / point) и
      intCheck = price /point;
      if (intRecord > intCheck) continue;

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 раз за 3403 мс.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 раз за 2505 мс.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 раз за 1712 мс.

Но 3-й не может быть практически, а 2-й (intRecord > intCheck) имел на 1 присваивание больше для intCheck перед сравнением.


 
rfb:
Я протестировал (intRecord > price / point) и

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 раз за 3403 мс.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 раз за 2505 мс.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 раз за 1712 мс.

Но 3-й не может быть практически, а 2-й (intRecord > intCheck) имел на 1 присвоение больше для intCheck перед сравнением.


Что такое intRecord?
 
То же самое, что и "int intCheck", но значение присваивается перед функцией, как и другим переменным.