Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 973

 

Здравствуйте.

Прошу помочь разобраться. При проверке работы простого массива (присваиваю значение);

 a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

      H= 1/(1+exp(-a[0][2]));

      a[0][2]=H;

      Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), "   H=",H,"   a[0][2]=",a[0][2]);


Получаю результат:

2019.09.21 13:21:44.328 2011.01.03 14:54:20  W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18  W EURUSD,H4:  1/(1+exp(-a[0][2]))=0.7310585786300049   H=1.0   a[0][2]=1.0

Как так ?

 
im-zvv:

Здравствуйте.

Прошу помочь разобраться. При проверке работы простого массива (присваиваю значение);

 a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

      H= 1/(1+exp(-a[0][2]));

      a[0][2]=H;

      Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), "   H=",H,"   a[0][2]=",a[0][2]);


Получаю результат:

2019.09.21 13:21:44.328 2011.01.03 14:54:20  W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18  W EURUSD,H4:  1/(1+exp(-a[0][2]))=0.7310585786300049   H=1.0   a[0][2]=1.0

Как так ?

сложный пример у Вас для воспроизведения, но подозреваю, что из за приведения типов Вы получаете не то, что ожидали

поэкспериментируйте с таким кодом:

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5;     //    a = 0.0
   Print("a = ",a);  
}

затем с такими:

void OnStart()
{
   double a;
   int b = 2;
   a = b /(double) 5;     //    a = 0.4
   Print("a = ",a);  
}

и

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5.0;     //  a = 0.4
   Print("a = ",a);  
}

и поиском по форуму "вещественные числа", если кратко, то "Си-шное" приведение типов поначалу вызывает недоумение ;)

 

Вы показали кучу примеров с применением переменных типа int.

У меня все переменные double.

Так что приведение переменных к одному формату не пройдет.

 
im-zvv:

Вы показали кучу примеров с применением переменных типа int.

У меня все переменные double.

Так что приведение переменных к одному формату не пройдет.

 a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), "   H=",H,"   a[0][2]=",a[0][2]);


Получаю результат:

2019.09.21 13:21:44.328 2011.01.03 14:54:20  W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18  W EURUSD,H4:  1/(1+exp(-a[0][2]))=0.7310585786300049   H=1.0   a[0][2]=1.0

Как так ?

у Вас целые константы, как и сам пример не воспроизводим - нет типов переменных, ну и в целом - моя "куча примеров" может быть посчитана без ПК, Ваш же пример... ну скажите на вскидку сколько будет е^(-91.49999)

ладно, проехали не смогу помочь

 

Очень жаль... что "  не смогу помочь"...

Дело не в том сколько будет e^(-91.49999). Вопрос в том почему в переменную типа double = H, неправильно записывается 

вычисленное ранее число типа double = 0.7310585786300049 , а записывается 1.0 (кстати double).

Если Вы потрудитесь запустить мой код в тестере , предполагаю Ваш МТ4 выдаст тоже самое.

Если так то MQL4 для работы использовать просто нельзя и опасно!

 
im-zvv:

Очень жаль... что "  не смогу помочь"...

я помог, помощь не означает сделайте за меня или я  все равно не буду читать, а результат мне важен!

im-zvv:

Если так то MQL4 для работы использовать просто нельзя и опасно!

 поведение при расчете математических выражений MQL4 / MQL5 полностью совпадает с С++, можете обратиться на любой форум по С++ со своим вопросом, может быть там актив сумеет помочь

ну и Ваш вопрос из области помогите/объясните/научите, перешел в область обсуждения платформы МТ, не нравится не юзайте, Вы ее получили бесплатно?

... в древние времена непонимание физических процессов вызывало у людей панический страх, то гром грянет, то землетрясение... сначала это вызывало панику и домыслы, потом появилась религия  )))

 

Вы зря так рассердились.

Если я задел Ваши личные чувства, я искренне прошу прощения.

МТ4 я абсолютно не обсуждаю и не осуждаю. Я просто предложил запустить 

присланный мной код в тестере МТ4, и если при условии , что все переменные (H, a[0][2]

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

в чем дело? Вам я его и адресовал.

Еще раз : Очень жаль... что "  не смогу помочь"...

Всего доброго.

 
im-zvv:

 что все переменные (H, a[0][2]

определены как double 

еще раз повторюсь - у Вас константы в математическом выражении есть? - в моем примере тоже есть константа 5 ... затем я написал 5.0  - для компилятора это не одно и то же!  а затем я явно привел целую константу 5 к типу double ---> для компилятора это будет то же, что примером выше 5.0


Ваш вопрос повторяется регулярно на форуме, хотя возможно я не вижу в чем заключается Ваш вопрос - у Вас "тяжелая формула" и не очевидные переменные - уберите лишнее из примеров - массивы и экспоненту - тогда будет видно в чем вопрос, хотя если уберете все лишнее, скорее всего сами найдете где получили не то, что ожидали - у меня так обычно ;)


ЗЫ: а экспонента в степени минус 91.49   - это не сильно маленькое число?  тип double имеет большую точность, но в сотой степени да и с учетом знака минус - по моему это выражение будет терять точность, не хочу гуглить, но первое что пролистал это Вики

 

Благодарю Вас за терпение!

Попробовал так :

 A=91.49999999993754;//a[0][2]=91.49999999993754;

Print("A=",A);

      H= 1/(1+exp(-A));

      //A=H;

      Print(" 1/(1+exp(-A))=",1/(1+exp(-A)), "   H=",H,"   a[0][2]=",a[0][2]);

Результат:

2019.09.21 16:14:17.691 2011.01.04 22:29:51  W EURUSD,H4: A=91.49999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50  W EURUSD,H4:  1/(1+exp(-A))=1.0   H=1.0   a[0][2]=0.0

!!!!! Это показывает что     1/(1+exp(-91.49999999993754))=1.0  а если оставить как в коде A=H то вычисление продолжается в команде Print (

Буду разбираться почему 1/(1+exp(-91.49999999993754))=1.0 .

Прошу меня понять. Сейчас я занимаюсь настройкой и обучением нейросети. сам код сырой, и даже я сам в нем путаюсь...:)

Заметил , что сеть повторяет ошибки. И основная ошибка в вычислении сигмоида. ОН НЕ ДОЛЖЕН БЫТЬ =1.


 
im-zvv:

Благодарю Вас за терпение!

Попробовал так :

 A=91.49999999993754;//a[0][2]=91.49999999993754;

Print("A=",A);

      H= 1/(1+exp(-A));

      //A=H;

      Print(" 1/(1+exp(-A))=",1/(1+exp(-A)), "   H=",H,"   a[0][2]=",a[0][2]);

Результат:

2019.09.21 16:14:17.691 2011.01.04 22:29:51  W EURUSD,H4: A=91.49999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50  W EURUSD,H4:  1/(1+exp(-A))=1.0   H=1.0   a[0][2]=0.0

!!!!! Это показывает что     1/(1+exp(-91.49999999993754))=1.0  а если оставить как в коде A=H то вычисление продолжается в команде Print (

Буду разбираться почему 1/(1+exp(-91.49999999993754))=1.0 .

Прошу меня понять. Сейчас я занимаюсь настройкой и обучением нейросети. сам код сырой, и даже я сам в нем путаюсь...:)

Заметил , что сеть повторяет ошибки. И основная ошибка в вычислении сигмоида. ОН НЕ ДОЛЖЕН БЫТЬ =1.


так Вы ничего не найдете, вот решил проверить, нужно так искать где баг или не точность в коде:

void OnStart()
  {
      double a=91.49999999993754;
      Print("1. a = ",a);
      double H= 1/(1+exp(-a));
      a=H;
      Print("2. a = ",a);
      Print("3. H = ",H);
      double e = exp(-91.49999999993754);
      Print("4. e = ",e);
  }

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 4. e = 1.828331349163451e-40

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 3. H = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 2. a = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 1. a = 91.49999999993754

и дальше вычислите по шагам и распринтуйте результаты, но по моему  в шаге №4 точность уже будет падать, у меня результат видите какой: 1.82 х 10^(-40) - это очень маленькое число и любые операции с такими маленькими числами в дальнейшем будут еще больше терять точность, это так сказать "магия" при работе с вещественными числами - чтобы не потерять точность с такими маленькими числами нужно попытаться сделать вычисления в целых числах или в double, но без потери мантиссы числа - нужно умножить на  10^40 ...- тут в общем нужно считать, так с ходу не помогу