Si aspetta che la funzione MathMin() sia deterministica. Quindi che dia sempre lo stesso risultato quando i due argomenti sono uguali. E non un risultato diverso a seconda che l'argomento sia il primo o il secondo.
fxsaber ha ragione, questo è un problema.
ahhh..., allora perché era così confuso su " Matematicamente la stessa espressione (evidenziata) " e l'unione era sufficiente:
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?
Ho un'ottima comprensione della questione, quindi ho scritto entrambe le versioni di MathMin per dimostrare che funzioni matematicamente identiche nei linguaggi di programmazione producono risultati diversi.
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
}
Sembra che si tratti di un bug.
In C++ funziona bene:
#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();
}
nella console:
Long negative zero = 0
Domanda rivolta agli sviluppatori. È normale che nella finestra di debug la variabile Union non si espanda e non reagisca affatto a un clic?
I campi Union.Num1 e Union.Num2 sono stati aggiunti manualmente. Almeno in questo modo si possono vedere i valori...
//+------------------------------------------------------------------+//| Returns the bit representation corresponding to a double value . |//+------------------------------------------------------------------+long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
return dbl.bits;
}
o la versione più breve
long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl = { value };
return dbl.bits;
}
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Si aspetta che la funzione MathMin() sia deterministica. Quindi che dia sempre lo stesso risultato quando i due argomenti sono uguali. E non un risultato diverso a seconda che l'argomento sia il primo o il secondo.
fxsaber ha ragione, questo è un problema.
ahhh..., allora perché era così confuso su " Matematicamente la stessa espressione (evidenziata) " e l'unione
era sufficiente:
ma dal momento che 0.0 == -0.0, allora non riesco a immaginare una situazione in cui questo potrebbe essere un problema e, influenzare qualsiasi cosa
una vecchia caratteristica di Min/Max in MQL: funzionano come pensano gli sviluppatori, cioè correttamente :-)
sono gli standard ad essere sbagliati.
ahhh..., allora perché era così confuso su " Matematicamente la stessa espressione (evidenziata) " e l'unione
era sufficiente:
ma dato che 0.0 == -0.0, non riesco a immaginare una situazione in cui questo possa essere un problema e, di fatto, influire su qualsiasi cosa.
Se non fosse zero, allora sarebbe un problema. E a zero non influisce su nulla.
Per:
c++ - Qual è la differenza tra -0 e 0? - Stack Overflow
Quindi, tutto ciò che dovete sapere è che 0 = -0
Questa è l'intera caratteristica che non influenza i calcoli e la logica
Ho un'ottima comprensione della questione, quindi ho scritto entrambe le versioni di MathMin per dimostrare che funzioni matematicamente identiche nei linguaggi di programmazione producono risultati diversi.
Sembra che si tratti di un bug.
In C++ funziona bene:
nella console:
Long negative zero = 0Domanda rivolta agli sviluppatori. È normale che nella finestra di debug la variabile Union non si espanda e non reagisca affatto a un clic?
I campi Union.Num1 e Union.Num2 sono stati aggiunti manualmente. Almeno in questo modo si possono vedere i valori...
Funziona come previsto! Il primo bit (indice di bit 0) è il bit di segno, che viene impostato per -0,0.
Questi sono anche altri casi speciali nel formato ieee 754. https://www. wikiwand.com/en/IEEE%20754#Special_values
Sembra che si tratti di un bug.
Funziona bene in C++:
nella console:
non c'è nessun bug. In C ++ è la stessa cosa.
hai semplicemente commesso un errore di formattazione e di tipo
provate questo:
Nello stesso contesto, è possibile esaminare la rappresentazione a 64 bit dei doppi https://www.mql5.com/en/code/20822
o la versione più breve
non c'è nessun bug. È lo stesso in C++.
ha solo commesso un errore di formattazione e di tipo.
provate questo:
Sì, ero di fretta. Grazie per la scienza ))
A volte è necessario inserire rapidamente un EA nel Tester. Potete farlo in questo modo.
Selezionate una data nel futuro e premete CTRL+F5 in ME.