Проблемы с делением!

 

Подскажите пожалуйста как поделить число 1 на 2 чтобы получилось 0,5
Пробовал 1/2 получилось 0
Пробовал 1 % 2 получилось 5

КАК ПОЛУЧИТЬ 0.5! ???

В справке по mql ничего не написано

 
double a=1.0; double b=2.0; double c=a/b; Print("c=",c); или 1.0/2.0
 

Все дело в том что мне нужно делить на число int n, которое ранее используется для обращения к массиву arr[] и потому не может быть double

 
При делении на целое число всегда будет так получаться. Только деление действительных чисел даст нужный результат.
 
Можно сделать по другому. double a; int b; double c=a/(b*1.0); Так должно работать
 

С делением еще туда сюда :) Можно разобраться. а вот что делать с количеством циклов ?

Не знаю сталкивался ли еще кто с такой ситуацией ( или на это не обращают внимание- в смысле не проверяют - так ли уж все правильно работает на больших объемах исторических даннаых ? Я вот люблю все пощупать сам.)

А ситуация следующая- сделал обычный скрипт - простенький

Выводит количество баров в истории - и показывает Дату и Цену Открытия и Закрытия

И что получается - Баров в истории к примеру 2391, а выводит данных только по 114.

Причем все дело в цикле - for - Не хочет приничать переменная i - которая определенна как счетчик количества циклов значение всего количества баров истории графика.

Можете сами убедиться. Максимальное количество циклов удалось сделать 255.

И все. О каком тогда иссследовании истории можно говорить?

Кто то сам проверял? Так ли действительно правильно работает оператор FOR. И действительно ли мы получаем ту информацию ( надеясь что все правильно работает) которую запрашиваем.

Для интересующихся даю скрипт- кто хочет проверит.

Файлы:
 
sergei:

С делением еще туда сюда :) Можно разобраться. а вот что делать с количеством циклов ?

Не знаю сталкивался ли еще кто с такой ситуацией ( или на это не обращают внимание- в смысле не проверяют - так ли уж все правильно работает на больших объемах исторических даннаых ? Я вот люблю все пощупать сам.)

А ситуация следующая- сделал обычный скрипт - простенький

Выводит количество баров в истории - и показывает Дату и Цену Открытия и Закрытия

И что получается - Баров в истории к примеру 2391, а выводит данных только по 114.

Причем все дело в цикле - for - Не хочет приничать переменная i - которая определенна как счетчик количества циклов значение всего количества баров истории графика.

Можете сами убедиться. Максимальное количество циклов удалось сделать 255.

И все. О каком тогда иссследовании истории можно говорить?

Кто то сам проверял? Так ли действительно правильно работает оператор FOR. И действительно ли мы получаем ту информацию ( надеясь что все правильно работает) которую запрашиваем.

Для интересующихся даю скрипт- кто хочет проверит.

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

 
_Temoha_:

Подскажите пожалуйста как поделить число 1 на 2 чтобы получилось 0,5
Пробовал 1/2 получилось 0
Пробовал 1 % 2 получилось 5

КАК ПОЛУЧИТЬ 0.5! ???

В справке по mql ничего не написано


1. Дробная часть значения, полученного при делении целых чисел, отбрасывается. Поэтому если int A=1.0 и int B = 2 ,то результатом вычисления значения выражения А/В будет целое число: 1/2 = 0,5 но ,5 отбрасывается, а остаётся 0

2. Если doubl A=1.0 и int B = 2 ,то при вычислении значения выражения А/В используется правило неявного преобразования типов. Тип double имеет более высокий приоритет, поэтому значение выражения, получаемое в результате выполнения операции деления, будет иметь тип double, т.е. будет иметь дробную часть, результат будет 0.5

3. Существует ещё правило явного преобразования типов. Пусть doubl A=1.0 и int B = 2

Если int С = А/В ,то действительное значение 0.5 выражения в правой части от знака равенства должно быть присвоено целой переменной С. При выполнении операции присваивания выполняется приведение типа значения: сначала действительное 0.5 преобразуется в целое 0 (ноль, с отбрасыванием дробной части), а затем 0 присвоится переменной С. Здесь С=0

Если double С = А/В ,то преобразования типов не происходит, т.к. действительное значение 0.5 спокойно присваивается действительной переменной С. Здесь С = 0.5

 
Vinin:

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


Скрипт на истории работает. Скрипт отличается от советника главным образом свойствами специальной функции start(). В советнике эта функция запускается на исполнение многократно (на ближайшем тике, пришедшем после окончания предыдущего сеанса исполнения), а в скрипте - один раз, и после окончания работы больше не запускается.

Все операторы работают как положено и в экспертах и в скриптах. Если запустить такой код:

int start()
   {
   int i, k;                              // Инициализируем переменную
   for (i = Bars-1; i >= 0; i--)          // Цикл
      {
      k++;                                // Счётчик итераций       
      }
   Alert ("Значение Bars = ",Bars,"   Количество итераций = ",k);  
   return;
   }

то (на моей истории) получается такой результат:

 
SK. писал (а):
Vinin:

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


Скрипт на истории работает. Скрипт отличается от советника главным образом свойствами специальной функции start(). В советнике эта функция запускается на исполнение многократно (на ближайшем тике, пришедшем после окончания предыдущего сеанса исполнения), а в скрипте - один раз, и после окончания работы больше не запускается.

Все операторы работают как положено и в экспертах и в скриптах. Если запустить такой код:

int start()
   {
   int i, k;                              // Инициализируем переменную
   for (i = Bars-1; i >= 0; i--)          // Цикл
      {
      k++;                                // Счётчик итераций       
      }
   Alert ("Значение Bars = ",Bars,"   Количество итераций = ",k);  
   return;
   }

то (на моей истории) получается такой результат:

К сожалению скрипт на истории все таки не работает, а только на видимой части.

 
_Temoha_:

Все дело в том что мне нужно делить на число int n, которое ранее используется для обращения к массиву arr[] и потому не может быть double

 
int I(double x) {
        return(MathRound(x));
}