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.
ahhh..., warum war es dann so verwirrend mit " Mathematisch derselbe Ausdruck (hervorgehoben) " und union war genug:
In C++, for example returns . The expression is true, but the bits are different. What is the purpose of having something like which should be but is represented differently? Is used exactly the same way as in any computations?
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
}
Es scheint ein Fehler zu sein.
In C++ funktioniert es einwandfrei:
#include <iostream>
using namespace std;
//template <typename T>
T ToType(constdouble Num)
{
union UNION
{
T Num1;
double Num2;
} Union;
Union.Num2 = Num;
return(Union.Num1);
}
//int main()
{
double positive_zero_val, negative_zero_val;
positive_zero_val = 0.0;
negative_zero_val = -0.0;
//---long long_negative_zero_val = ToType<long>(negative_zero_val);
printf("\nLong negative zero = %d", long_negative_zero_val);
cin.get();
}
in der Konsole:
Long negative zero = 0
Eine Frage an die Entwickler. Ist es normal, dass im Debugging-Fenster die Variable Union nicht expandiert und überhaupt nicht auf einen Klick reagiert?
Die Felder Union.Num1 und Union.Num2 wurden manuell hinzugefügt. Auf diese Weise können Sie wenigstens die Werte sehen...
//+------------------------------------------------------------------+//| Returns the bit representation corresponding to a double value . |//+------------------------------------------------------------------+long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
return dbl.bits;
}
oder die kürzere Version
long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl = { value };
return dbl.bits;
}
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.
ahhh..., warum war es dann so verwirrend mit " Mathematisch derselbe Ausdruck (hervorgehoben) " und union
war genug:
aber da 0.0 == -0.0, kann ich mir keine Situation vorstellen, in der das ein Problem sein könnte und überhaupt irgendetwas beeinflussen könnte
eine alte Funktion von Min/Max in MQL - sie funktionieren so, wie die Entwickler denken, d.h. korrekt :-)
es sind die Normen, die falsch sind.
ahhh..., warum war es dann so verwirrend mit " Mathematisch derselbe Ausdruck (hervorgehoben) " und union
war genug:
Aber da 0,0 == -0,0 ist, kann ich mir keine Situation vorstellen, in der dies ein Problem darstellen und überhaupt irgendetwas beeinflussen könnte
Wenn es nicht Null wäre, dann wäre es ein Problem. Und bei Null hat es keine Auswirkungen.
For:
c++ - Was ist der Unterschied zwischen -0 und 0? - Stack Overflow
Alles, was du wissen musst, ist also, dass 0 = -0
Das ist die ganze Funktion, die keine Auswirkungen auf Berechnungen und Logik hat
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.
Es scheint ein Fehler zu sein.
In C++ funktioniert es einwandfrei:
in der Konsole:
Long negative zero = 0Eine Frage an die Entwickler. Ist es normal, dass im Debugging-Fenster die Variable Union nicht expandiert und überhaupt nicht auf einen Klick reagiert?
Die Felder Union.Num1 und Union.Num2 wurden manuell hinzugefügt. Auf diese Weise können Sie wenigstens die Werte sehen...
Funktioniert wie erwartet! Das erste Bit (Bit-Index 0) ist das Vorzeichenbit, das für -0,0 gesetzt ist.
Dies sind auch weitere Sonderfälle im IEEE-754-Format. https://www. wikiwand.com/en/IEEE%20754#Special_values
Es scheint ein Fehler zu sein.
In C++ funktioniert es gut:
in der Konsole:
Es gibt keinen Fehler. In C++ ist es dasselbe.
Sie haben nur einen Fehler bei der Formatierung und dem Typ gemacht
Versuchen Sie dies:
Im gleichen Zusammenhang kann dies die 64-Bit-Darstellung von Doubles https://www.mql5.com/en/code/20822
oder die kürzere Version
Es gibt keinen Fehler. Es ist dasselbe in C++.
hat nur einen Fehler bei der Formatierung und dem Typ gemacht
Versuchen Sie dies:
Ja, ich war in Eile. Vielen Dank für die Wissenschaft ))
Manchmal müssen Sie einen EA schnell in den Tester einfügen. Das können Sie folgendermaßen tun.
Wählen Sie ein Datum in der Zukunft und drücken Sie STRG+F5 in ME.