Скачать MetaTrader 5

как запрограммировать такое выражение?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114280
Forex Trader  
как сделать, чтоб присвоить переменной знак от другой переменной?
y=(x>0)*2-1; ?????

а как-то попроще нельзя?

p.s. извините за тупой вопрос.
Forex Trader
114280
Forex Trader  
как сделать, чтоб присвоить переменной знак от другой переменной?
y=(x>0)*2-1; ?????

а как-то попроще нельзя?
По идее лобовая if-else конструкция должна работать быстрее. Побитовых операций в MQL нет, так что пока мне ничего лучше в голову не пришло.
MetaQuotes Software Corp.
Модератор
185381
MetaQuotes Software Corp.  
Побитовых операций в MQL нет

Вообще-то есть:

Побитовые операции

Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.

b = ~n;

Двоичное представление x сдвигается вправо на y разрядов. Сдвиг вправо логический, то есть освобождающиеся слева разряды будут заполняться нулями.
Пример:

x = x >> y;

Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.
Пример:

x = x << y;

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.
Пример:

b = ((x & y) != 0);

Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 - во всех остальных разрядах.
Пример:

b = x | y;

Побитовая операция исключающее ИЛИ (EXCLUSIVE OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.
Пример:

b = x ^ y;

Замечание: Битовые операции выполняются только с целыми числами.
Forex Trader
114280
Forex Trader  
P.S. Я имел в виду if(x<0) y=-MathAbs(y); else y=MathAbs(y);
или, +- 1, если как в примере.
Это к посту Myxu
Наличие побитовых операций даёт повод для приятных размышлений :)
Forex Trader
114280
Forex Trader  
Я уже много забыл, но если знак определяется левым битом, то для +- 1 по идее y = 1 | (x & 0x80000000) (чистим биты x, кроме старшего и складываем с 1), или, для перемены знака y = (y & 0x7FFFFFFF) | (x & 0x80000000) (чистим левый бит y и складываем). Нуждается в проверке, разумеется.
Нет, не работает, попробую разобраться (Это добавлено позже, когда я до МТ добрался).
Forex Trader
114280
Forex Trader  
как сделать, чтоб присвоить переменной знак от другой переменной?
y=(x>0)*2-1; ?????
По идее лобовая if-else конструкция должна работать быстрее. Побитовых операций в MQL нет, так что пока мне ничего лучше в голову не пришло.

а это разве по сути не if-then конструкция?
а MathAbs разве не вызов функции?

а количество битов в double и в int разное.. хотя это не важно, т.к.
битовые операции выполняются только с целыми числами.

а для снятия знака можно сдвинуть влево, а потом вправо.

только что подумал, что целое число можно сдвинуть вправо на все биты, кроме последнего...
Forex Trader
114280
Forex Trader  
а это разве по сути не if-then конструкция?
Да, только добавлено умножение и вычитание
а MathAbs разве не вызов функции?
Да. А как без неё превратить +-1 в знак конкретного числа? Если это критично, имеет смысл проверить скорость. Вдруг разработчики для неё inline подстановку делают?

То что я писал не работает потому что я забыл про представление в дополнительном коде :(. Надо ещё подумать.
Forex Trader
114280
Forex Trader  
а это разве по сути не if-then конструкция?
Да, только добавлено умножение и вычитание
Правильнее пожалуй, что в первом случае идёт сравнение, умножение, вычитание, присваивание, а во втором сравнение, переход(наверняка в пределах кеша) и присваивание. Я это так понимаю.
Forex Trader
114280
Forex Trader  
Вот, такое выродилось: y = y*(1 - 2*(x^y)>>31); Вроде работает. Но с MathAbs по скорости обязательно сравнить надо.
Forex Trader
114280
Forex Trader  
Похоже я поддался ifобоязни :). Вот это тоже должно работать:
if((x^y)>>31) y=-y;
Но проверять не буду :)
Forex Trader
114280
Forex Trader  
Для ненулевых можно просто:
y = x / MathAbs(x)



Думаю, быстрее сравнений будет.

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