Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 973

 

Bonjour.

Aidez-moi à comprendre. Lors de la vérification du fonctionnement d'un tableau simple (affectation d'une valeur) ;

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]) ;


J'obtiens le résultat :

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

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

Comment cela ?

 
im-zvv:

Bonjour.

Aidez-moi à comprendre. Lors de la vérification du fonctionnement d'un tableau simple (affectation d'une valeur) ;

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]) ;


J'obtiens le résultat :

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

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

Comment cela ?

Cet exemple est difficile à reproduire, mais je soupçonne qu'à cause de la conversion de type, vous obtenez un résultat différent de celui auquel vous vous attendez.

Expérimentez avec ce code :

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

puis avec ç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);  
}

et faites une recherche sur le forum pour "real numbers", en bref, la conversion en C est un peu déroutante au début ;)

 

Vous avez montré un tas d'exemples utilisant des variables int.

Mes variables sont toutes doubles.

Ainsi, la conversion des variables au même format ne fonctionnera pas.

 
im-zvv:

Vous avez montré un tas d'exemples utilisant des variables int.

Mes variables sont toutes doubles.

La conversion de la variable au même format ne fonctionnera donc pas.

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]) ;


J'obtiens le résultat :

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

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

Comment cela ?

Vous avez des constantes entières et l'exemple lui-même n'est pas reproductible - pas de types de variables, enfin en général - ma "pile d'exemples" peut être calculée sans PC, votre exemple... dis-moi juste ce qu'est e^(-91.49999).

Ok, oublie ça. Je ne peux pas t'aider.

 

C'est une honte que "je ne peux pas aider"...

La question n'est pas de savoir combien e^(-91,49999). La question est de savoir pourquoi une variable de type double = H, est incorrectement écrite

calculé plus tôt le nombre de type double =0.7310585786300049 , mais il est écrit 1.0 (accessoirement double).

Si vous essayez d'utiliser mon code dans le testeur, je pense que votre MT4 affichera la même chose.

Si c'est le cas, vous ne pouvez tout simplement pas utiliser MQL4 pour travailler et c'est dangereux !

 
im-zvv:

Dommage... "Je ne peux pas aider"...

J'ai aidé, aider ne signifie pas le faire pour moi ou je ne le lirai pas de toute façon, et je me soucie du résultat !

im-zvv:

Si c'est le cas, le MQL4 ne peut tout simplement pas être utilisé pour le travail et est dangereux !

Le comportement de MQL4 / MQL5 dans le calcul d'expressions mathématiques est le même qu'en C++. Vous pouvez poser votre question sur n'importe quel forum C++, peut-être qu'un expert vous aidera.

Votre question est passée du stade de l'aide/explication/enseignement à celui de la discussion sur la plateforme MT. Vous ne l'aimez pas, vous l'avez reçue gratuitement ?

... Dans les temps anciens, le manque de compréhension des processus physiques provoquait une peur panique chez les gens, un tonnerre ou un tremblement de terre... au début, elle a provoqué panique et spéculation, puis est venue la religion ))))

 

Tu n'aurais pas dû être si en colère.

Si j'ai blessé vos sentiments personnels, je m'en excuse sincèrement.

Je ne discute pas et ne juge pas du tout MT4. J'ai simplement suggéré que vous exécutiez

Je viens de proposer d'exécuter le code que je vous ai envoyé dans le testeur de MT4 et si toutes les variables (H,a[0][2])

sont définis comme des doubles et le résultat est le même que pour moi, j'ai une question :

Quel est le problème ? Je vous l'ai adressée.

Encore une fois : jesuis désolé... "je ne peux pas aider"...

Au revoir.

 
im-zvv:

que toutes les variables (H,a[0][2])

sont définis comme doubles

Encore une fois - avez-vous des constantes dans votre expression mathématique ? - mon exemple a aussi la constante 5 ... puis j'ai écrit 5.0 - ce n'est pas la même chose pour le compilateur ! et puis j'ai explicitement amené la constante entière 5 au type double ---> pour le compilateur ce sera la même chose que l'exemple ci-dessus 5.0


Votre question est répétée régulièrement sur le forum, bien que je ne voie pas forcément quelle est votre question - vous avez une "formule lourde" et des variables pas évidentes - supprimez ce qui n'est pas nécessaire dans les exemples - tableaux et exposant - alors vous verrez quel est le problème, bien que si vous supprimez tout ce qui n'est pas nécessaire, vous trouverez très probablement que vous n'avez pas obtenu ce que vous attendiez - c'est ce que je fais habituellement ;)


HH : et l'exposant à la puissance de moins 91,49 - n'est pas un très petit nombre ? type double a une grande précision, mais à la puissance centième et en tenant compte du signe moins - à mon avis, cette expression va perdre de la précision, je ne veux pas de google, mais la première chose que j'ai fait défiler à travers ce Wiki

 

Merci de votre patience !

J'ai essayé ceci :

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]) ;

Résultat :

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

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

! !!!! Cela montre que 1/(1+exp(-91.49999999993754))=1.0 mais si je le laisse comme dans le code A=H alors le calcul continue dans la commande Print (

Je vais essayer de trouver pourquoi 1/(1+exp(-91.49999999993754))=1.0.

Comprenez-moi bien. Pour l'instant, je suis occupé à régler et à former le réseau neuronal. Le code lui-même est rudimentaire et je m'y perds moi-même... :)

Je remarque que le réseau répète des erreurs. Et la principale erreur est dans le calcul de la sigmoïde. ÇA NE DEVRAIT PAS ÊTRE =1.


 
im-zvv:

Merci de votre patience !

J'ai essayé ceci :

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]) ;

Résultat :

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

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

! !!!! Cela montre que 1/(1+exp(-91.49999999993754))=1.0 mais si je le laisse comme dans le code A=H alors le calcul continue dans la commande Print (

Je vais essayer de trouver pourquoi 1/(1+exp(-91.49999999993754))=1.0.

Comprenez-moi bien. Je m'occupe maintenant du réglage et de l'entraînement du réseau neuronal. Le code lui-même est grossier et je m'y perds moi-même... :)

Je remarque que le réseau répète des erreurs. Et la principale erreur est dans le calcul de la sigmoïde. ÇA NE DEVRAIT PAS ÊTRE =1.


Vous ne trouverez donc rien, c'est ce que j'ai décidé de vérifier, vous devez chercher où se trouve le bug ou l'imprécision du code :

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

et ensuite calculer par étapes et réimprimer les résultats, mais à mon avis dans l'étape #4 la précision va déjà baisser, mon résultat est le suivant : 1.82 x 10^(-40) - c'est un très petit nombre et toute opération avec de tels petits nombres à l'avenir va perdre encore plus de précision, c'est une soi-disant "magie" lorsque l'on travaille avec des nombres réels - pour ne pas perdre la précision avec de tels petits nombres pour essayer de faire des calculs en nombres entiers ou en double, mais sans perdre le nombre de mantisse - vous avez besoin de multiplier par 10^40 ... - puis en général besoin de compter, alors allez-y je ne vais pas vous aider
Raison: