Caractéristiques du langage mql5, subtilités et techniques - page 242

 
Alain Verleyen #:

Il s'attend à ce que la fonction MathMin() soit déterministe. C'est-à-dire qu'elle donne toujours le même résultat lorsque les deux arguments sont identiques. Et non un résultat différent selon que l'argument est le premier ou le second.

fxsaber a raison, c'est un problème.

ahhh..., alors pourquoi était-ce si confus à propos de " Mathematically the same expression (highlighted) " et l'union
était suffisante :

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

mais puisque 0.0 == -0.0, je ne peux pas imaginer une situation où cela pourrait être un problème et affecter quoi que ce soit.

 

une ancienne caractéristique de Min/Max dans MQL - ils fonctionnent comme les développeurs le pensent, c'est-à-dire correctement :-)

ce sont les normes qui sont erronées.

 
Nikolai Semko #:

ahhh..., alors pourquoi était-ce si confus à propos de " Mathematically the same expression (highlighted) " et l'union
était suffisante :

mais puisque 0.0 == -0.0, je ne peux pas imaginer une situation où cela pourrait être un problème et, en fait, affecter quoi que ce soit.

Si ce n'était pas zéro, alors ce serait un problème. Et à zéro, cela n'affecte rien.
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++ - Quelle est la différence entre -0 et 0 ? - Stack Overflow




Tout ce qu'il faut savoir, c'est que 0 = -0
C'est toute la fonctionnalité qui n'affecte pas les calculs et la logique.

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 #:

J'ai une excellente compréhension de la question et j'ai donc écrit les deux versions de MathMin pour montrer que des fonctions mathématiquement identiques dans des langages de programmation produisent des résultats différents.

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
}

Il semble qu'il s'agisse d'un bogue.

La fonction fonctionne parfaitement en C++ :

#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();
}

dans la console :

Long negative zero = 0


Question en passant aux développeurs. Est-il normal que dans la fenêtre de débogage la variable Union ne se développe pas et ne réagisse pas du tout à un clic ?


Les champs Union.Num1 et Union.Num2 ont été ajoutés manuellement. Au moins, de cette manière, on peut voir les valeurs...

 
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)
  }
  

Fonctionne comme prévu ! Le premier bit (index 0) est le bit de signe qui est défini pour -0,0.

Il s'agit également de cas plus particuliers dans le format ieee 754. 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 #:

Il semble qu'il s'agisse d'un bogue.

Il fonctionne parfaitement en C++ :

dans la console :

il n'y a pas de bug. En C++, c'est la même chose.
vous avez juste fait une erreur de formatage et de type.

essayez ceci :

#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);
}
 

Dans le même contexte, on peut examiner la représentation en 64 bits des 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;
  }

ou la version abrégée

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

   return dbl.bits;
  }
 
Nikolai Semko #:

il n'y a pas de bug. C'est la même chose en C++.
a juste fait une erreur de formatage et de type.

essayez ceci :

Oui, j'étais pressé. Merci pour la science ))

 

Parfois, vous avez besoin de mettre rapidement un EA dans le Tester. Vous pouvez le faire comme suit.

Sélectionnez une date dans le futur et appuyez sur CTRL+F5 dans ME.