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

 
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:

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

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

 
Artyom Trishkin:

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

Попробую оформить.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

Уважаемые веб дизайнеры сайта,

вот Вам скриншот сообщений, скажите пожалуйста какой собеседник сейчас выбран


Уже глаза на лоб лезят что бы понять кому пишешь ....

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

 
Vladimir Pastushak:

Уважаемые веб дизайнеры сайта,

вот Вам скриншот сообщений, скажите пожалуйста какой собеседник сейчас выбран


Уже глаза на лоб лезят что бы понять кому пишешь ....

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

2

Хотя согласен. Не всегда это замечаешь, контраста мало.