Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 242

 
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.

ahhh..., warum war es dann so verwirrend mit " Mathematisch derselbe Ausdruck (hervorgehoben) " und union
war genug:

Print(MathMin(-0.0, 0.0)); // 0.0
Print(MathMin(0.0, -0.0)); // -0.0

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.

 
Nikolai Semko #:

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:

x * 0.0 = 0.0
x * -0.0 = -0.0
x + -0.0 = x
x - -0.0 = x
pow(x,-0.0) = 1
log(0.0)  // -inf
log(-0.0)  // -inf
 

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

What is the difference between -0 and 0?
What is the difference between -0 and 0?
  • 2010.09.14
  • Danvil Danvil 22.5k 20 20 gold badges 66 66 silver badges 90 90 bronze badges
  • stackoverflow.com
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?
 
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
}

Es scheint ein Fehler zu sein.

In C++ funktioniert es einwandfrei:

#include <iostream>

using namespace std;
//
template <typename T>
T ToType(const double 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...

 
string DoubleToHexadecimal(const double value)
  {
   return StringFormat("0x%.16llX", value);
  }

void OnStart()
  {
   Print(DoubleToHexadecimal(0.0) );    // 0x0000000000000000   (i.e, long integer 0)
   Print(DoubleToHexadecimal(-0.0) );   // 0x8000000000000000   (i,e, LONG_MIN -9223372036854775808)
  }
  

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

void OnStart()
  {
   const double Nan = (double)"nan";
   const double Inf = (double)"inf";

   Print( MathMin(Nan, Inf));   // inf
   Print( MathMin(Inf, Nan));   // nan

   Print( MathMin(Nan, 0));     // 0.0
   Print( MathMin(0, Nan));     // nan
  }
 
Denis Kirichenko #:

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:

#include <iostream>

using namespace std;
//
template <typename T>
T ToType(const double 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  long_negative_zero_val = ToType<long long>(negative_zero_val);
    printf("\nLong negative zero = %ll d", long_negative_zero_val);
}
 

Im gleichen Zusammenhang kann dies die 64-Bit-Darstellung von Doubles https://www.mql5.com/en/code/20822

//+------------------------------------------------------------------+
//| Returns the bit representation corresponding to a double value . |
//+------------------------------------------------------------------+
long DoubleToLongBits(const double value)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;

   return dbl.bits;
  }

oder die kürzere Version

long DoubleToLongBits(const double value)
  {
   union _d {double value; long bits;} dbl = { value };

   return dbl.bits;
  }
 
Nikolai Semko #:

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.

Grund der Beschwerde: