Кто-то явно считать не умеет... :(

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

Точнее не кто-то, а что-то...

Считаю в калькуляторе: 

54 / 100 * 54 + 54 = 83,16

Считаю в советнике:

period_2 = (int)MathRound(54 / 100 * 54 + 54);
Comment(period_2);

результат = 54.

Мозг плавится. Что где не так?

Sergey Savinkin
2099
Sergey Savinkin  

Тут все просто. У Вас целочисленная константа 54 делится на 100. Получается 0,54, но МТ пытается привести ее к (int). Это ноль. Ну а дальше ноль умножается на 54 и т.д. 

Добавлено:

Вот так

int period_2=(int)MathRound(54.0/100.0*54.0+54);
   Comment(period_2);

работает

Igor Zakharov
6499
Igor Zakharov  

тема появляется с периодичностью в 2 недели :)

54 / 100 = 0

54.0 / 100 = 54 / 100.0 = 0,54

Объяснение:

int / int = int

double / int = double

int / double = double

Vasiliy Pushkaryov
6961
Vasiliy Pushkaryov  
Сергей Таболин:

Точнее не кто-то, а что-то...

Считаю в калькуляторе: 

54 / 100 * 54 + 54 = 83,16

Считаю в советнике:

результат = 54.

Мозг плавится. Что где не так?

(54/100) * 54 = 29,16

54 / (100*54) = 0,01

Ставьте в круглые скобки, что Вам нужно. У умножения и деления приоритет одинаков, но последовательность одинаковых по приоритету операций не всегда гарантируется.
Сергей Таболин
2644
Сергей Таболин  
Sergey Savinkin:

Тут все просто. У Вас целочисленная константа 54 делится на 100. Получается 0,54, но МТ пытается привести ее к (int). Это ноль. Ну а дальше ноль умножается на 54 и т.д. 

Добавлено:

Вот так

работает

Нууу, косяк... Я искренне считал, что раз уж double MathRound(double value), то внутри всё само должно привестись к даблу....

Спасибо.

Evgeniy Kvasov
973
Evgeniy Kvasov  
period_2 = (int)MathRound(54 / 100 * 54 + 54);

я обычно добавляю явное преобразование
 в таком если виде то period_2 = (int)MathRound(54 / 100.0 * 54 + 54); или еще так period_2 = (int)MathRound(54 / (double)100 * 54 + 54);
Alexey Volchanskiy
27267
Alexey Volchanskiy  
Vasiliy Pushkaryov:

(54/100) * 54 = 29,16

54 / (100*54) = 0,01

Ставьте в круглые скобки, что Вам нужно. У умножения и деления приоритет одинаков, но последовательность одинаковых по приоритету операций не всегда гарантируется.

Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.

Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.

Vasiliy Pushkaryov
6961
Vasiliy Pushkaryov  
Alexey Volchanskiy:

Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.

Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.

Да, перепутал, читал у Прата похожую ситуацию: float logs = 120 / 4 * 5

потом шел такой пример:

int dues = 20 * 5 + 24 * 6;

Можно было бы предположить, что в соответствии со свойством ассоциативности должна быть  выполнена операция слева, однако в данном случае две операции умножения не  относятся к одному и тому же операнду, поэтому эти правила здесь не могут быть  применены. В действительности выбор порядка выполнения операций, который будет приемлемым для системы, оставлен за конкретной реализацией C++.

Захаров правильно подметил по целочисленному результату: 54 / 100 = 0

MetaQuotes
Админ
27478
Renat Fatkhullin  
Alexey Volchanskiy:

Неверно, последовательность вычислений именно в таком выражении 54 / 100 * 54 будет строго слева направо и результат будет эквивалентен (54/100) * 54.

Не путайте с оптимизацией логических выражений. Кстати, а MQL5 ее вообще делает? Во взрослых компиляторах такая оптимизация включается или отключается ключом.

Все константные выражения типа (54 / 100 * 54 + 54) считаются на этапе компиляции.
Сергей Таболин
2644
Сергей Таболин  

На мой взгляд достаточно мутная, не очевидная ситуация.

   double ddd;
   ddd = 54 / 100;
   Comment(ddd);

Результат вы знаете. Но, возможно, стоит приводить тип не результата, а операндов?

Ну или выдать предупреждение...
Aleksey Semenov
3623
Aleksey Semenov  
не мпомню точно, но кто-то сказал что можно в ворнинги смотреть на ошибки приведения типов (possible loss of data due to type conversion), говорят #property strict  в этом помогает и никогда не использовать полностью константные выражения - для этого есть калькулятор
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий