Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Stanislav Korotky
21488
Stanislav Korotky  

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

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

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

Андрей
1890
Андрей  
marketeer:

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

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

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

IgorM М
4801
IgorM М  

такое поведение при расчетах характерно для Явы, у меня был баг, когда из переменной datetime вычитал int, результаты отличались от вычитания 2-х datetime, уже не помню как, но рассчитывал время между приходом тиков, т.е. переполнения никак не могло быть

Владимир
1402
Владимир  

Всем привет!

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

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

   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.

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

Андрей
1890
Андрей  
VBAG:

Всем привет!

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

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

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

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

int a = 20;
a *= 0.5; 

IgorM М
4801
IgorM М  
VBAG:



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

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

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

Владимир
1402
Владимир  
jartmailru:

int a = 20;
a *= 0.5;


Да, я невнимательно читал исходные устовия топикстартера.
Vladimir Gomonov
8312
Vladimir Gomonov  
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

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

Владимир
1402
Владимир  
marketeer:

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

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

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


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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий