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 :
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?
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( 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
}
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(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();
}
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...
//+------------------------------------------------------------------+//| Returns the bit representation corresponding to a double value . |//+------------------------------------------------------------------+long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
return dbl.bits;
}
ou la version abrégée
long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl = { value };
return dbl.bits;
}
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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 :
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.
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 :
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.
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.
Il semble qu'il s'agisse d'un bogue.
La fonction fonctionne parfaitement en C++ :
dans la console :
Long negative zero = 0Question 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...
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
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 :
Dans le même contexte, on peut examiner la représentation en 64 bits des doubles https://www.mql5.com/en/code/20822
ou la version abrégée
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.