Два соседних BookEvent могут дублировать стакан - страница 4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dina Paches
5220
Dina Paches  
fxsaber:

У чисел double нет никакой особенности. Никакой!

double - 8 байтов. И если эти 8 байтов с точностью до каждого бита совпадают (оператор ==), то эти double идентичны. Если не совпадают - нет.

Если Вы считаете, что (double)35*0.01 должен быть равен (double)0.35, потому что так в школе говорят. То это лишь Ваше желание и представление, что так якобы должно быть. Поэтому, чтобы Ваши (и многих других) представления не ломались, Вы делаете нормализацию при сравнении этих совершенно не совпадающих double. И получаете, конечно, их равенство. В Справке об этом и написано, только про школу там не договаривают.

Без намека на какую-либо снисходительность, в полном восхищении от Женской логики и упрямства! Удачи.  

Когда нужно, что бы какие-либо "сигналы" в программе срабатывали там, где задумывалось и не срабатывали там, где не подразумевалось, применение нормализации значений может помогать получать результаты не "наоборот".

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

Взаимно - удачи. И хорошего отдыха в выходные дни. 

Slava
Модератор
13449
Slava  
fxsaber:

Плохо по-русски выразился. Вот так будет правильнее:

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

Что Вы скажете по поводу нижеприведённого примера?

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
void OnStart()
  {
   double first=0.3;
   double second=3.0;
   double third=second-2.7;
   if(first!=third)
     {
      if(CompareDoubles(first,third))
         printf("%.16f  %.16f   все таки равны",first,third);
     }
  }
// Результат: 0.3000000000000000  0.2999999999999998   все таки равны
fxsaber
16799
fxsaber  
Slawa:

Что Вы скажете по поводу нижеприведённого примера?

Ровно то же, что и сказал

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Два соседних BookEvent могут дублировать стакан

fxsaber, 2016.09.17 00:33

У чисел double нет никакой особенности. Никакой!

double - 8 байтов. И если эти 8 байтов с точностью до каждого бита совпадают (оператор ==), то эти double идентичны. Если не совпадают - нет.

Если Вы считаете, что (double)35*0.01 должен быть равен (double)0.35, потому что так в школе говорят. То это лишь Ваше желание и представление, что так якобы должно быть. Поэтому, чтобы Ваши (и многих других) представления не ломались, Вы делаете нормализацию при сравнении этих совершенно не совпадающих double. И получаете, конечно, их равенство. В Справке об этом и написано, только про школу там не договаривают.

В Вашем примере first и third - это разные double-числа. Не идентичные то бишь. Если Вам хочется разные double считать "равными", Вы можете сравнивать нормализованную разность с нулем, как и делаете. Теперь Ваши double "равны" благодаря Вашему желанию. Ну это как говорить, что целые числа 1 и 5 "равны" между собой с точностью до 10-ти.

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

Slava
Модератор
13449
Slava  

Это - придирка к формулировкам

Чтобы понять, что два double идентичны,

И если эти 8 байтов с точностью до каждого бита совпадают (оператор ==), то эти double идентичны. Если не совпадают - нет.

Идентичными даблы будут только тогда, когда получены одним и тем же способом, в результате одних и тех же вычислительных операций. Если Вы можете гарантировать одинаковость получения сравниваемых вещественных чисел, тогда да, можно использовать простое сравнение.

fxsaber
16799
fxsaber  
Slawa:

Это - придирка к формулировкам

Идентичными даблы будут только тогда, когда получены одним и тем же способом, в результате одних и тех же вычислительных операций. Если Вы можете гарантировать одинаковость получения сравниваемых вещественных чисел, тогда да, можно использовать простое сравнение.

Я выступаю за осознанное программирование и четкое понимание, почему здесь так-то, а не иначе. Кому-то жирное слово, возможно, порезало здесь

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Два соседних BookEvent могут дублировать стакан

fxsaber, 2016.09.16 16:18

А универсальное решение сравнения любых массивов?
template <typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
  const int Amount = ArraySize(Array1);
  bool Res = (Amount == ArraySize(Array2));

  if (Res)
    for (int i = 0; i < Amount; i++)
      if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
      {
        Res = false;

        break;
      }

  return(Res);
}

так вот подобные придирки на пустом месте в состоянии довести ситуацию до абсурда - передавать указатель на bool-функцию сравнения T-типа. И она должна быть даже для int-ов.

Придраться можно всегда. А так смотрим самый первый пост, который рабочий на все 100%. Там MqlBookInfo (содержащий double) сравниваются между собой именно так, как надо - без нормализации. Тему нормализации изучил вдоль и поперек.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Альтернативные реализации стандартных функций/подходов

fxsaber, 2016.09.02 10:58

Теперь работает всегда правильно, но быстрее оригинала всего на 10%
double MyNormalizeDouble( const double Value, const uint digits )
{
  static const double Points[] = {1.0e-0, 1.0e-1, 1.0e-2, 1.0e-3, 1.0e-4, 1.0e-5, 1.0e-6, 1.0e-7, 1.0e-8};
  const double point = digits > 8 ? 1.0e-8 : Points[digits];
  const long Integer = (long)Value; // чтобы не создавать крайне медленный относительный epsilon

  return((long)((Value > 0) ? (Value - Integer) / point + HALF_PLUS : (Value - Integer) / point - HALF_PLUS) * point + Integer);
}
prostotrader, Спасибо за найденные несоответствия!
10% выигрыша в x64 и сотни процентов выигрыша в x32 (на всех MT4).

 

Так что предлагаю тему сравнения double закончить в данной ветке, т.к. оффтоп полный.

fxsaber
16799
fxsaber  
Билд 1432 - дублей стакана не обнаружил. Спасибо!
prostotrader
8071
prostotrader  
fxsaber:
Билд 1432 - дублей стакана не обнаружил. Спасибо!

У меня не загружается 1432 :(

Прикрепи, плиз в ZIP 

fxsaber
16799
fxsaber  
prostotrader:

У меня не загружается 1432 :(

Прикрепи, плиз в ZIP 

Получил в частном порядке, поэтому не могу. Дождитесь ближайшего обновления.
prostotrader
8071
prostotrader  
fxsaber:
Получил в частном порядке, поэтому не могу. Дождитесь ближайшего обновления.
:)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий