Баг МТ4 - разработчикам посвящается

 

Сообщение направляю разработчикам:

результат MathFloor(15/0.05*0.01) будет 3,

результат MathFloor(15*0.01/0.05) будет 2,

хотя в обоих случаях должно быть 3 !

Вывод: функция MathFloor() работает неправильно.

MathFloor() - нужная функция, используется постоянно, при больших депозитах разбег будет колоссальный.

Ждём устранения бага в следующем билде МТ4.

 

Замените 15 на 15.0 и перепроверьте результат.

Затем читайте маны про преобразование int-double до полного вкуривания.

 

результат MathFloor(15.0*0.01/0.05) остаётся всё так же неправильный.

Так что преобразование тут ни при чём.

Ещё будут варианты умников?

Вопрос по-прежнему адресуется разработчикам.

 
Andrey1979:

Так что преобразование тут ни при чём.

Ещё будут варианты умников?

Ни при чем. Уел. В данном случае корректней пользоваться MathRound из-за потери точности при вычислении.

В первом выражении погрешность вверх, во втором вниз, отсюда и разность результатов. В любом случае в терминале ошибки нет.

 

Запускаем то же самое в Visual Studio.
std::cout << floor(15/0.05*0.01); // дает 3
std::cout << floor(15*0.01/0.05); // дает 2
C'est la vie.
.
НО: с чем соглашусь: если Mql язык для трейдеров-
вынь да положь вычисления без этих нюансов :-P.
.
P.S.: умножение на 0.01- это, по идее, просто вычитание 
двойки из мантиссы. Куда там девается точность-
ума не приложу.

 
TheXpert:

В данном случае корректней пользоваться MathRound из-за потери точности при вычислении.

В любом случае в терминале ошибки нет.

MathRound не подходит. Нужна целая часть числа, а не округление. Если округлять - то часто превышаются риски, а это недопустимо.

А ошибка разработчиков всё-таки есть, так как результат MathFloor(15.0*0.01/0.05) не может быть 2, как говорит МТ4

 


Ответ не получен. Результат MathFloor(15.0*0.01/0.05) по-прежнему 2, что есть неправильно.

Преобразование в double ничего не даёт в данном случае.

Настоящая проблема в том, что MathFloor() довольно часто используется, и подобных несоответствий истинному результату может быть много.

 
Andrey1979:

MathRound не подходит. Нужна целая часть числа, а не округление. Если округлять - то часто превышаются риски, а это недопустимо.

А ошибка разработчиков всё-таки есть, так как результат MathFloor(15.0*0.01/0.05) не может быть 2, как говорит МТ4


Почему так сразу кто-то виноват, а не я себе любимый? Надо правильно даблами пользоваться - MathFloor(NormalizeDouble(15.0*0.01/0.05,8)); 

 
Integer:


  Почему так сразу кто-то виноват, а не я себе любимый? Надо правильно даблами пользоваться - MathFloor(NormalizeDouble(15.0*0.01/0.05,8)); 

Если для человека студия не указ- Дмитрий, зачем продолжать дискуссию?
 

А вот так работает правильно:

   Print("MathFloor(15/0.05*0.01) = ",MathFloor(15/0.05*0.01));

   Print("MathFloor(15*0.01/0.05) = ",MathFloor(15*0.01/0.05+0.00000000000001));

Можно делать вывод где собака порылась....

P.S. Я бы ни студии, ни борланду и вообще никому не доверял бы. Берешь асм и пишешь на нем совершенно надежную свою функцию и ей доверяешь.