Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 143

 
Alexey Viktorov:

Man sollte nur nicht erwarten, dass, wenn es keinen Wert gibt, dieser zwangsläufig 0 ist und entsprechend falsch, wenn es sich nicht um eine Variable vom Typ bool handelt. Auch eine explizite Umwandlung in bool hilft nicht weiter.

So funktioniert es ohne Fehler.

Ich verstehe ehrlich gesagt überhaupt nicht, woher die Null kommt:

const double Points = TickValue[0] ? Profit / (Lots * TickValue[0] * _Point) : 0; // zero divide

TickValue[0] enthält Unfug. Sie kann gleich Null sein, muss es aber nicht.

Wenn der Papierkorb in TickValue[0] ungleich Null ist, dann berechnen wir Points = Profit / Lots * non-zero trash * _Point, andernfalls, wenn der Papierkorb in TickValue[0] gleich Null ist - setzen wir Points mit Null gleich.

Und woher bekommt der Ausdruck Lots * non-zero rubbish * _Point die Null, wenn Lots bei der Deklaration mit Eins initialisiert wird? Stehtin _Point eine Null?

 
fxsaber:

Der Fehler ist in der Tat eindeutig.

OK, der Fehler ist unklar. Und es reproduziert sich bei mir auch nicht.

 
TheXpert:

Ok, der Fehler ist unverständlich. Und es reproduziert sich nicht bei mir.

Grob gesagt kann der Aufruf dieser Funktion zu einer Division durch Null führen.

// Неправильно написанная функция.
double WrongFunc( const double Num )
{
  return(Num ? 1 / (0.1 * Num) : 0);
}


In der Praxis bin ich auf dieses Problem in der Berichtsbibliothek gestoßen. Dann wurde mir klar, dass das logisch ist.

 
fxsaber:

Grob gesagt kann der Aufruf dieser Funktion zu einer Division durch Null führen.

Ich habe diesen Code auf border dubles, aber es stürzt nicht ab

double f( const double Num )
{
  return(Num ? 1 / (0.1 * Num) : 0);
}

void OnStart()
{
  Print(f(1 e-308));  // 2019.10.28 13:02:19.457	test (USDJPY,H1) inf
}
 
TheXpert:

Ich erhalte den gleichen Code bei Border Dubles, aber es stürzt nicht ab.

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart()
{
  double Num = 0;
  
  _W(Num) = (uchar)2;
  
  Print(WrongFunc(Num));
}
 
fxsaber:
ein solcher Schreck.
 
TheXpert:
einen solchen Absturz.

Zusammenfassend lässt sich sagen, dass die Multiplikation von zwei von Null verschiedenen Dubletten Null ergeben kann. Und dies ist kein degenerierter Fall, sondern ein realer Fall in der Praxis.

Grob gesagt, kann ein Kampf-EA mit an Sicherheit grenzender Wahrscheinlichkeit daran zerbrechen.

 
Und die Prüfung auf Null wird nicht gespeichert, weder explizit noch implizit (bool-Konvertierung)
 
TheXpert:
Und die Prüfung auf Null wird nicht gespeichert, weder explizit noch implizit (bool-Konvertierung)
  return(0.1 * Num ? 1 / (0.1 * Num) : 0);
 
fxsaber:

Zusammenfassend lässt sich sagen, dass die Multiplikation von zwei von Null verschiedenen Dubletten Null ergeben kann. Und dies ist kein degenerierter Fall, sondern ein realer Fall in der Praxis.

Grob gesagt, kann ein Kampf-EA mit an Sicherheit grenzender Wahrscheinlichkeit daran zerbrechen.

auf NaN müssen Sie zusätzlich prüfen, höchstwahrscheinlich wird dieser Code funktionierenhttp://qaru.site/questions/20557/checking-if-a-double-or-float-is-nan-in-c

f != f

oder die Genauigkeit einschränken, wie im CompareDoubles()-Beispiel - es scheint in SBhttps://www.mql5.com/ru/docs/basis/types/double zu sein

Grund der Beschwerde: