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

 
Aliaksandr Hryshyn:

Ошибка для разработчиков.

Скрипт не компилируется, определите почему))). Используйте прикрепленный файл.


Этот же файл:


Все компилируется, удалите строку Error

 
Vladimir Pastushak:

Все компилируется, удалите строку Error

ограничение на длину строки в редакторе

 
Fast528:

ограничение на длину строки в редакторе

Строка не отображается, когда она становиться больше 4095 символов.

 
fxsaber:

Просьба объяснить глупцу, из-за чего здесь такое происходит?

Допустим мы можем оперировать только с нечётными числами, а если результат арифметической операции становится чётным, то он полагается равным ближайшему сверху нечётному числу, тогда:

(43 -  5) - 7  = (38)39 - 7  = (32)33
 43 - (5  + 7) = 43 - (12)13 = (30)31 

33 != 31

 
fxsaber:
Несколько часов потратил на поиск расхождений. Нашел такое


Особенности double знаю, но не такие, что если поменять порядок сложения (за исключением относительно сильно отличных чисел), то результат будет разный! Просьба объяснить глупцу, из-за чего здесь такое происходит?

В исходнике нужно смотреть только на две нижние строки.

Как Вы сами любите говорить, аголитм, который закладывается на точность округления double до одинаковой цифры на пределе указанной точности - "кривой". Причина, очевидно. в том, что одинаковое значение, получаемое разными способами (перемена местами множителей, раскрытие скобок и т.п.) в представлении double могут оказываться разными числами, максимално приближенными к нужному с разных сторон. Округлите до следующей цифры, а дальше сами решите, как действовать с последней...

 
fxsaber:

Когда делаете size+point, то переполняете мантиссу с последующим округлением/отбросом (в зависимости от режима fpu.

   float avg = 0.7;
   float size = 0.3;
   float point = 0.4;

   float r1 = avg - size - point;
   float r2 = avg - (size + point);
   cout << "r1 == r2 ? " << (r1 == r2) << '\n';

   cout << "-----avg-----\n";  prfl(avg);
   cout << "-----size-----\n"; prfl(size);
   cout << "-----point-----\n"; prfl(point);
   cout << "-----avg - size------\n"; prfl(avg - size);
   cout << "-----(avg - size) - point------\n"; prfl((avg - size) - point);
   cout << "-----size + point------\n"; prfl(size + point);
   cout << "-----avg - (size + point)------\n"; prfl(avg - (size + point));
r1 == r2 ? 0
-----avg-----
implicit_1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
exponenta = -1
sign = 0
-----size-----
implicit_1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0
exponenta = -2
sign = 0
-----point-----
implicit_1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1
exponenta = -2
sign = 0
-----avg - size------
implicit_1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
exponenta = -2
sign = 0
-----(avg - size) - point------
implicit_1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
exponenta = -25
sign = 1
-----size + point------
implicit_1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0
exponenta = -1
sign = 0
-----avg - (size + point)------
implicit_1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
exponenta = -24
sign = 1

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

 
A100:
Ilya Malev:
pavlick_:

Спасибо за ответы, каждый был ценен. Впервые столкнулся (заметил), что добавление к ЦЕНЕ одних и тех же пунктов, но в разной последовательности создает разные ЦЕНЫ. Отсюда в Тестере получаются отличающиеся результаты.

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


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

 
fxsaber:

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

А ещё есть мнение, что если результаты ТС сильно меняются от таких незначительных вещей, нужно сказать "спасибо" и выкинуть такую ТС в мусор.

 
fxsaber:

Спасибо за ответы, каждый был ценен. Впервые столкнулся (заметил), что добавление к ЦЕНЕ одних и тех же пунктов, но в разной последовательности создает разные ЦЕНЫ. Отсюда в Тестере получаются отличающиеся результаты.

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


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

Может стоит отобразить в особенностях?

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Ilya Malev:

А ещё есть мнение, что если результаты ТС сильно меняются от таких незначительных вещей, нужно сказать "спасибо" и выкинуть такую ТС в мусор.

Не сильно меняются, а просто меняются. Этого достаточно, чтобы начать расследование.

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