Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 973

 

Hallo.

Bitte helfen Sie mir zu verstehen. Bei der Überprüfung der Funktion eines einfachen Arrays (Zuweisung eines Wertes);

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


Ich erhalte das Ergebnis:

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

Wie das?

 
im-zvv:

Hallo.

Bitte helfen Sie mir zu verstehen. Bei der Überprüfung der Funktion eines einfachen Arrays (Zuweisung eines Wertes);

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


Ich erhalte das Ergebnis:

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

Wie das?

Dieses Beispiel ist schwer zu reproduzieren, aber ich vermute, dass Sie aufgrund der Typkonvertierung ein anderes Ergebnis erhalten als erwartet.

Experimentieren Sie mit diesem Code:

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

dann mit diesem:

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

und machen Sie eine Forensuche nach "realen Zahlen", kurz gesagt, die C-Umrechnung ist anfangs etwas verwirrend ;)

 

Sie haben eine Reihe von Beispielen mit int-Variablen gezeigt.

Meine Variablen sind alle doppelt.

Eine Konvertierung der Variablen in dasselbe Format ist also nicht möglich.

 
im-zvv:

Sie haben eine Reihe von Beispielen mit int-Variablen gezeigt.

Meine Variablen sind alle doppelt.

Die Konvertierung von Variablen in dasselbe Format wird also nicht funktionieren.

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


Ich erhalte das Ergebnis:

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

Wie das?

Du hast ganzzahlige Konstanten und auch das Beispiel selbst ist nicht reproduzierbar - keine Variablentypen, naja im Allgemeinen - mein "Beispielstapel" kann ohne PC berechnet werden, dein Beispiel... Sagen Sie mir einfach, was e^(-91,49999) ist.

Okay, vergessen Sie es. Ich kann Ihnen nicht helfen.

 

Es ist eine Schande, dass " nicht helfen kann"...

Die Frage ist nicht, wie viel e^(-91,49999). Die Frage ist, warum eine Variable vom Typ double = H, falsch geschrieben wird

berechnete frühere Zahl vom Typ double =0.7310585786300049 , aber es wird 1.0 geschrieben (übrigens double).

Wenn Sie versuchen, meinen Code im Tester zu verwenden, wird Ihr MT4 wohl das Gleiche anzeigen.

Wenn dies der Fall ist, können Sie MQL4 nicht für die Arbeit verwenden und es ist gefährlich!

 
im-zvv:

Schade... "kann nicht helfen"...

Ich habe geholfen, Hilfe bedeutet nicht, es für mich zu tun, sonst würde ich es nicht lesen, und das Ergebnis ist mir wichtig!

im-zvv:

Wenn dies der Fall ist, kann MQL4 einfach nicht für die Arbeit verwendet werden und ist gefährlich!

Das Verhalten von MQL4 / MQL5 bei der Berechnung von mathematischen Ausdrücken ist das gleiche wie in C++. Sie können mit Ihrer Frage in jedes C++-Forum gehen, vielleicht hilft Ihnen dort ein Experte weiter

Ihre Frage hat sich von Hilfe/Erklärung/Lehre zu einer Diskussion über die MT-Plattform verschoben, gefällt sie Ihnen nicht, haben Sie sie umsonst erhalten?

... In der Antike verursachte das mangelnde Verständnis physikalischer Vorgänge bei den Menschen panische Angst, Donner oder Erdbeben... Zuerst löste es Panik und Spekulationen aus, dann kam die Religion ))))

 

Sie hätten nicht so wütend sein dürfen.

Sollte ich Ihre persönlichen Gefühle verletzt haben, möchte ich mich aufrichtig entschuldigen.

Ich diskutiere oder beurteile MT4 überhaupt nicht. Ich habe lediglich vorgeschlagen, dass Sie die

Ich habe gerade angeboten, den Code, den ich Ihnen geschickt habe, im Tester von MT4 laufen zu lassen und wenn alle Variablen (H,a[0][2])

als double definiert sind und das Ergebnis dasselbe ist wie bei mir, habe ich eine Frage:

Was ist das Problem? Ich habe es an Sie gerichtet.

Noch einmal: Es tut mirleid... "Ich kann nicht helfen"...

Auf Wiedersehen.

 
im-zvv:

dass alle Variablen (H,a[0][2])

sind definiert als double

Noch einmal: Haben Sie Konstanten in Ihrem mathematischen Ausdruck? - mein Beispiel hat auch die Konstante 5 ... dann habe ich 5.0 geschrieben - für den Compiler ist das nicht dasselbe! und dann habe ich die Integer-Konstante 5 explizit auf den Typ double gebracht ---> für den Compiler wird das dasselbe sein wie das obige Beispiel 5.0


Ihre Frage wird regelmäßig auf dem Forum wiederholt, obwohl ich vielleicht nicht sehen, was Ihre Frage ist - Sie haben eine "schwere Formel" und nicht offensichtlich Variablen - entfernen Sie unnötige von Beispielen - Arrays und Exponent - dann werden Sie sehen, was das Problem ist, obwohl, wenn Sie alle unnötigen zu entfernen, werden Sie höchstwahrscheinlich finden, wo Sie nicht, was Sie erwartet haben - ich in der Regel tun;)


HH: und der Exponent hoch minus 91,49 - ist nicht eine sehr kleine Zahl? Typ double hat eine große Genauigkeit, sondern auf die hundertste Potenz und unter Berücksichtigung der Minus-Zeichen - meiner Meinung nach wird dieser Ausdruck verlieren Genauigkeit, ich will nicht zu googeln, aber das erste, was ich durch dieses Wiki gescrollt

 

Vielen Dank für Ihre Geduld!

Ich habe es versucht:

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

Ergebnis:

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

!!!!! Dies zeigt, dass 1/(1+exp(-91.49999999993754))=1.0 ist, aber wenn ich es wie im Code A=H belasse, wird die Berechnung im Befehl Print fortgesetzt (

Ich werde versuchen herauszufinden, warum 1/(1+exp(-91,49999999993754))=1,0.

Bitte verstehen Sie mich. Ich bin jetzt damit beschäftigt, das neuronale Netz abzustimmen und zu trainieren. Der Code selbst ist grob und sogar ich selbst komme darin durcheinander... :)

Ich stelle fest, dass das Netzwerk Fehler wiederholt. Und der Hauptfehler liegt in der Berechnung des Sigmas. SOLLTE ES NICHT =1 SEIN.


 
im-zvv:

Vielen Dank für Ihre Geduld!

Ich habe es versucht:

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

Ergebnis:

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

!!!!! Dies zeigt, dass 1/(1+exp(-91.49999999993754))=1.0 ist, aber wenn ich es wie im Code A=H belasse, wird die Berechnung im Befehl Print fortgesetzt (

Ich werde versuchen herauszufinden, warum 1/(1+exp(-91,49999999993754))=1,0.

Bitte verstehen Sie mich. Ich bin jetzt damit beschäftigt, das neuronale Netz abzustimmen und zu trainieren. Der Code selbst ist grob und sogar ich selbst komme darin durcheinander... :)

Ich stelle fest, dass das Netzwerk Fehler wiederholt. Und der Hauptfehler liegt in der Berechnung des Sigmas. DARF SIE NICHT =1 SEIN.


Sie werden also nichts finden, deshalb habe ich beschlossen, zu prüfen, wo der Fehler oder die Ungenauigkeit im Code liegt:

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

und rechne dann schrittweise und drucke die Ergebnisse nach, aber meiner Meinung nach wird in Schritt #4 die Genauigkeit bereits abnehmen, mein Ergebnis ist wie folgt: 1.82 x 10^(-40) - das ist eine sehr kleine Zahl und jede Operation mit so kleinen Zahlen in der Zukunft wird weiter verlieren mehr Genauigkeit, das ist eine so genannte "Magie" bei der Arbeit mit reellen Zahlen - nicht auf die Genauigkeit mit so kleinen Zahlen zu verlieren, um zu versuchen, Berechnungen in ganzen Zahlen oder in Doppel zu machen, aber ohne Verlust der Mantisse Zahl - müssen Sie mit 10^40 multiplizieren ... - dann in der Regel brauchen, um zu zählen, so gehen Sie ich werde nicht helfen