Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 241

 
fxsaber #:

Sie wollen nicht verstehen.

Vielleicht würde ich das, wenn ich den Hintergrund der Situation kennen würde. Aber so, wie es aussieht, ist es richtig.

 
amrali #:

Solange die beiden Beträge gleich sind, ist jeder von ihnen ein gültiges Minimum. Betrachten wir MathMin(1, 1), so macht es keinen Unterschied, ob die Funktion den ersten (1) oder den zweiten (1) Wert liefert.

DieRückgabe von 0,0 unterscheidet sich also nicht von -0,0.

Edit: Übrigens sind die beiden hervorgehobenen Ausdrücke NICHT identisch.

Ich denke, ich stimme mit meinem Kollegen amrali überein. Ich würde auch hinzufügen, dass es eine native Funktion MathMin() gibt. Sie denkt auch, dass Nullen mit unterschiedlichen Vorzeichen gleich sind. Soweit ich weiß, ist ihr Algorithmus recht einfach. Ich habe ihn in meiner Funktion CustomMathMin() dupliziert.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
   double positive_zero_val, negative_zero_val;
   positive_zero_val = 0.0;
   negative_zero_val = -0.0;
   // 1) -0.0 / 0.0
   double native_min_val, custom_min_val;
   native_min_val = ::MathMin(negative_zero_val, positive_zero_val);
   custom_min_val = CustomMathMin(negative_zero_val, positive_zero_val);
   ::Print("\nArguments: -0.0, 0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   // 2) 0.0 / -0.0
   native_min_val = ::MathMin(positive_zero_val, negative_zero_val);
   custom_min_val = CustomMathMin(positive_zero_val, negative_zero_val);
   ::Print("\nArguments: 0.0, -0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   }
//+------------------------------------------------------------------+
//| Custom MathMin                                                   |
//+------------------------------------------------------------------+
double CustomMathMin(double  value1, double  value2)
   {
   if(value1 < value2)
      return value1;
   return value2;
   }
//+------------------------------------------------------------------+


Wir haben ihn im Protokoll:

2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: -0.0, 0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) 
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: 0.0, -0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = -0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = -0.00


Es ist leicht zu erkennen, dass der Algorithmus von zwei gleichen Zahlen die zweite Zahl als Minimum annimmt...

Документация по MQL5: Математические функции / MathMin
Документация по MQL5: Математические функции / MathMin
  • www.mql5.com
MathMin - Математические функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

Sie wollen nicht verstehen.

   Print(-0.0<0.0);     // false
   Print(-0.0>0.0);     // false
   Print(-0.0<=0.0);    // true
   Print(-0.0>=0.0);    // true
   Print(-0.0==0.0);    // true

Es ist nichts Besonderes. Einfach nur -0,0==0,0.

 
Nikolai Semko #:

nichts Besonderes. Einfach -0.0==0.0

Ich kenne die Frage sehr gut, deshalb habe ich beide Varianten von MathMin geschrieben, um zu zeigen, dass mathematisch identische Funktionen in Programmiersprachen unterschiedliche Ergebnisse liefern.

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}
 
fxsaber #:

Da ich die Frage sehr gut verstehe, habe ich beide Versionen von MathMin geschrieben, um zu zeigen, dass mathematisch identische Funktionen in Programmiersprachen unterschiedliche Ergebnisse liefern.

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}

Was ist also ungewöhnlich?
Die Tatsache, dass bei den Zahlen 0.0 und -0.0 nicht alle 64 Bits gleich sind, ist offensichtlich:


aber trotzdem 0.0 == -0.0

Base Convert: IEEE 754 Floating Point
  • baseconvert.com
Online IEEE 754 floating point converter and analysis. Convert between decimal, binary and hexadecimal
 
Ihor Herasko #:

Die Zeichen < und <= scheinen unterschiedlich zu sein.....

zustimmen

 
Nikolai Semko # :

Was ist also ungewöhnlich?
Die Tatsache, dass bei den Zahlen 0.0 und -0.0 nicht alle 64 Bits gleich sind, ist offensichtlich:



Es wird erwartet, dass MathMin() deterministisch ist. Also immer das gleiche Ergebnis liefert, wenn die beiden Argumente gleich sind. Und nicht ein unterschiedliches Ergebnis, je nachdem, welches Argument das erste oder zweite ist.

fxsaber hat recht, das ist ein Problem.

 
Alain Verleyen #:

Sie erwartet, dass die Funktion MathMin() deterministisch ist. Sie soll also immer das gleiche Ergebnis liefern, wenn die beiden Argumente gleich sind. Und nicht ein unterschiedliches Ergebnis, je nachdem, welches Argument das erste oder zweite ist....

Und das ist der Fall. Wenn 2 Zahlen gleich sind, wird die zweite Zahl zurückgegeben. Ich habe oben mit einem Beispiel gezeigt...

 
   Print(pow(0.0,0.0)); 	// 1.0
   Print(pow(-0.0,-0.0));       // 1.0
   Print(pow(-0.0,0.0));        // 1.0
   Print(pow(0.0,-0.0));        // 1.0
   Print(0.0*-0.0);             // -0.0
   Print(-0.0*-0.0);            // 0.0


und daran ist nichts auszusetzen.

 
Alain Verleyen #:

Sie erwartet, dass die Funktion MathMin() deterministisch ist. Sie soll also immer das gleiche Ergebnis liefern, wenn die beiden Argumente gleich sind. Und nicht ein unterschiedliches Ergebnis, je nachdem, welches Argument das erste oder zweite ist.

fxsaber hat recht, das ist ein Problem.

Du hast meinen Standpunkt richtig verstanden. Man kann auf das schwer zu findende Problem stoßen, dass man in großem Code unterschiedliche Ergebnisse erhält. Deshalb habe ich die Community in diesem Thread informiert.