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 |//+------------------------------------------------------------------+voidOnStart()
{
double positive_zero_val, negative_zero_val;
positive_zero_val = 0.0;
negative_zero_val = -0.0;
// 1) -0.0 / 0.0double 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.2923:49:46.351 c11 (EURUSD,H1) Arguments: -0.0, 0.02024.01.2923:49:46.351 c11 (EURUSD,H1) Native min value = 0.002024.01.2923:49:46.351 c11 (EURUSD,H1) Custom min value = 0.002024.01.2923:49:46.351 c11 (EURUSD,H1)
2024.01.2923:49:46.351 c11 (EURUSD,H1) Arguments: 0.0, -0.02024.01.2923:49:46.351 c11 (EURUSD,H1) Native min value = -0.002024.01.2923: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...
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( constdouble Num )
{
union UNION
{
T Num1;
double Num2;
} Union;
Union.Num2 = Num;
return(Union.Num1);
}
voidOnStart()
{
Print(ToType<long>(MathMin(-0.0, 0.0))); // 0Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}
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( constdouble Num )
{
union UNION
{
T Num1;
double Num2;
} Union;
Union.Num2 = Num;
return(Union.Num1);
}
voidOnStart()
{
Print(ToType<long>(MathMin(-0.0, 0.0))); // 0Print(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:
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.
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...
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.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
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.
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.
Wir haben ihn im Protokoll:
Es ist leicht zu erkennen, dass der Algorithmus von zwei gleichen Zahlen die zweite Zahl als Minimum annimmt...
Sie wollen nicht verstehen.
Es ist nichts Besonderes. Einfach nur -0,0==0,0.
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.
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.
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
Die Zeichen < und <= scheinen unterschiedlich zu sein.....
zustimmen
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.
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...
und daran ist nichts auszusetzen.
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.