Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку.
Да даже если оно- это описание- было бы... это ничего бы не поменяло.
неприятный сюрприз...
такое поведение при расчетах характерно для Явы, у меня был баг, когда из переменной datetime вычитал int, результаты отличались от вычитания 2-х datetime, уже не помню как, но рассчитывал время между приходом тиков, т.е. переполнения никак не могло быть
Всем привет!
Мимо таких вещей не прохожу.
Решил проверить:
double a=20.0; double b=0.5; a=a*b; Alert("a=a*b ",DoubleToStr(a,2)); a=20.0; a*=b; Alert("a*=b ",DoubleToStr(a,2));
Похоже на то, что все корректно. Ответ - 10.
Как вы проверяли?
Всем привет!
Мимо таких вещей не прохожу.
Решил проверить:
Похоже на то, что все корректно. Ответ - 10.
Как вы проверяли?
int a = 20;
a *= 0.5;
прочитайте внимательно топик - баги появляются при несовпадении типов, причем, если я не ошибаюсь, то именно в моменты когда используется промежуточная переменная ячейка памяти, у меня, кажется и в операторе if() при вычислении условия были несоответствия,
теперь я четко внаяале произвожу вычисления с сохранением в переменную такого же типа как и вычисляемые данные, потом сравнение в if()
Наткнулся на "особенность". Оператор a *= b работает в MQL4 не так, как обычно предполагается в других языках, где есть такая же конструкция, а именно a = a * b. Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку. Фича возникает при несовпадении типов. Например, есть переменные int a (допустим, в конкретный момента равно 20) и double b (пусть дано = 0.5). Выражение a *= b дает результат ноль. Хотя эквивалент a = a * b правильно возвращает 10. В Си в аналогичной ситуации a*= b дает правильный результат 10.
Понятно, что вроде бы мелочь. Но при отсутствии нормального отладчика выискивание причины неправильных расчетов в очередной раз превращается в часы геморроя.
Обычный подход Метаквотов по отношению к пользователям.
Описывал я уже эту "особенность". Разработчики не снизошли, а Mathemat выразил мнение, что это очень удобно и вполне естественно.
Механизм описан в учебнике, но не очень четко. Дело в том, что при разнотипных операндах сначала тип второго операнда приводится к первому, а уже после происходит все остальное. В Вашем примере double 0.5 -> int 0. Поэтому a*=b -> 0, так же, как a+=b -> 20. Думаю, более половины прикладного софта (пользовательского) содержит в себе эту ошибку, поскольку народ, в большинстве, не готов к подобным сюрпризам.
int a = 20;
a *= 0.5;
Да, я невнимательно читал исходные устовия топикстартера.
void OnStart() { //--- int a=20; double x=0.5; Print("a *= x == ", a*=x); } //+------------------------------------------------------------------+
В пятёрке проверил - вроде нет такого, результ правильный.
2010.11.09 01:27:43 DivisionTest (EURUSD,M15) a *= x == 10
Вывод - айда все в пятёрку..!.. :-)
Наткнулся на "особенность". Оператор a *= b работает в MQL4 не так, как обычно предполагается в других языках, где есть такая же конструкция, а именно a = a * b. Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку. Фича возникает при несовпадении типов. Например, есть переменные int a (допустим, в конкретный момента равно 20) и double b (пусть дано = 0.5). Выражение a *= b дает результат ноль. Хотя эквивалент a = a * b правильно возвращает 10. В Си в аналогичной ситуации a*= b дает правильный результат 10.
Понятно, что вроде бы мелочь. Но при отсутствии нормального отладчика выискивание причины неправильных расчетов в очередной раз превращается в часы геморроя.
Обычный подход Метаквотов по отношению к пользователям.
Замечание, поддерживаю. Сам наступал не раз на грабли неявного приведения типов.
Может быть эта тема кому-то поможет и сбережет не один час драгоценного времени.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Наткнулся на "особенность". Оператор a *= b работает в MQL4 не так, как обычно предполагается в других языках, где есть такая же конструкция, а именно a = a * b. Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку. Фича возникает при несовпадении типов. Например, есть переменные int a (допустим, в конкретный момента равно 20) и double b (пусть дано = 0.5). Выражение a *= b дает результат ноль. Хотя эквивалент a = a * b правильно возвращает 10. В Си в аналогичной ситуации a*= b дает правильный результат 10.
Понятно, что вроде бы мелочь. Но при отсутствии нормального отладчика выискивание причины неправильных расчетов в очередной раз превращается в часы геморроя.
Обычный подход Метаквотов по отношению к пользователям.