Умножение с присваиванием: приветы Метаквотов и Метаквотам

 

Наткнулся на "особенность". Оператор a *= b работает в MQL4 не так, как обычно предполагается в других языках, где есть такая же конструкция, а именно a = a * b. Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку. Фича возникает при несовпадении типов. Например, есть переменные int a (допустим, в конкретный момента равно 20) и double b (пусть дано = 0.5). Выражение a *= b дает результат ноль. Хотя эквивалент a = a * b правильно возвращает 10. В Си в аналогичной ситуации a*= b дает правильный результат 10.

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

Обычный подход Метаквотов по отношению к пользователям.

 
marketeer:

Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку.

Проверил. Результат 0 :-).
Да даже если оно- это описание- было бы... это ничего бы не поменяло.
 

неприятный сюрприз...

 

такое поведение при расчетах характерно для Явы, у меня был баг, когда из переменной 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.

Как вы проверяли?

 
VBAG:

Всем привет!

Мимо таких вещей не прохожу.

Решил проверить:

Похоже на то, что все корректно. Ответ - 10.

Как вы проверяли?

int a = 20;
a *= 0.5; 

 
VBAG:



прочитайте внимательно топик - баги появляются при несовпадении типов, причем, если я не ошибаюсь, то именно в моменты когда используется промежуточная переменная ячейка памяти, у меня, кажется и в операторе if() при вычислении условия были несоответствия,

теперь я четко внаяале произвожу вычисления с сохранением в переменную такого же типа как и вычисляемые данные, потом сравнение в if()

 
marketeer:

Наткнулся на "особенность". Оператор 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. Думаю, более половины прикладного софта (пользовательского) содержит в себе эту ошибку, поскольку народ, в большинстве, не готов к подобным сюрпризам.

 
jartmailru:

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

Вывод - айда все в пятёрку..!.. :-)

 
marketeer:

Наткнулся на "особенность". Оператор a *= b работает в MQL4 не так, как обычно предполагается в других языках, где есть такая же конструкция, а именно a = a * b. Если в доках Метаквотов есть описание, как сие работает и почему отличается от стандарта, плиз дайте ссылку. Фича возникает при несовпадении типов. Например, есть переменные int a (допустим, в конкретный момента равно 20) и double b (пусть дано = 0.5). Выражение a *= b дает результат ноль. Хотя эквивалент a = a * b правильно возвращает 10. В Си в аналогичной ситуации a*= b дает правильный результат 10.

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

Обычный подход Метаквотов по отношению к пользователям.


Замечание, поддерживаю. Сам наступал не раз на грабли неявного приведения типов.

Может быть эта тема кому-то поможет и сбережет не один час драгоценного времени.