Ottenere il numero di posizioni decimali di qualsiasi numero (non solo le virgolette) bypassando Digits() in MQL4 e MQL5 - pagina 12

 
Ilya Malev:

Questa è probabilmente la soluzione migliore

non è corretto confrontare i doppi sull'uguaglianza, inoltre, il compito è quello di essere esatti al segno

Guardate il file stdlib.mq4 in MT4, c'era un esempio di doppio confronto corretto

ConfrontaDoppia()

SZZ: ecco un articolo sull'argomentohttps://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Mi chiedo come farai a contare i logaritmi, le potenze con numeri non interi, usare la trigonometria, .... utilizzare librerie di terze parti, indicatori... Hanno tutti degli errori!

Se avete bisogno di una precisione super-mega, potete usare librerie esterne speciali come gnu mp

Altrimenti, se avete bisogno di una precisione garantita (quando ad ogni operazione viene calcolato l'errore), dovreste usare ogni sorta di "interval libs".

se anche questo non è sufficiente - si possono usare polinomi al posto delle cifre

ma non ho mai visto casi simili, quando tali circuiti sono effettivamente utilizzati in MT:-)

c'è un doppio per l'occhio :-)

 
Igor Makanu:

non è corretto confrontare i doppi sull'uguaglianza, inoltre, il compito è quello di essere esatti ad un segno

Guardate il file stdlib.mq4 in MT4, c'era un esempio di doppio confronto corretto

ConfrontaDoppia()

Bene, il tempo di esecuzione con CompareDoubles sale di un fattore 2. Allora è meglio così:

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

Bene, bene, e il tempo di esecuzione con CompareDoubles sale di un fattore due. È meglio farlo così:

Stiamo parlando di calcolo corretto, non posso controllare il tuo codice ora, ma non è difficile, devi confrontare il tuo esempio con un esempio che usa DoubleToStr() nel ciclo, se non c'è differenza, allora tutto è corretto

ZS: ho provato con fmod() penso di aver postato un esempio, non funziona correttamente, come a 0.07 dovrebbe controllare - subito è spuntato un bug

 
Igor Makanu:

Stiamo parlando di un calcolo corretto, non posso controllare il tuo codice ora, ma non è difficile, devi confrontare il tuo esempio con quello che usa DoubleToStr() nel ciclo, se non c'è differenza, allora tutto è corretto

Ho già controllato e calcolato la velocità ed è il modo migliore. A meno che non abbiate bisogno di cercare più di 7 caratteri, naturalmente.

S.s. 0,7 e 0,07 e 500000000,0001, ecc. tutti calcolati correttamente.

s.s. Ma per 500000000.9991, gestisce peggio. Ma non ha quasi importanza nella pratica del forex.

 
Ilya Malev:

Ma nella pratica del forex questo è poco importante.

dipende dal problema. se è per gli ordini commerciali, allora questo problema non ha senso - i prezzi sono normalizzati alle cifre, mentre i lotti sono relativi al lotto minimo

Se il problema riguarda la modellazione matematica, può essere utile.

 
Igor Makanu:

dipende dal problema, se è per ordini di trading, allora questo compito non ha alcun senso - i prezzi sono normalizzati a cifre, e i lotti sono relativi al lotto minimo

Se il compito è con la modellazione matematica, può essere utile.

Naturalmente, non per scrivere reti neurali =))) e dire, è conveniente memorizzare prezzi/lotti/soldi come un intero a 4 byte con valore decimale, riducendo la dimensione dei dati di 2 volte.

 
Igor Makanu:

non è corretto confrontare i doppi sull'uguaglianza, inoltre, il compito è quello di essere esatti ad un segno

Guardate il file stdlib.mq4 in MT4, c'era un esempio di doppio confronto corretto

ConfrontaDoppia()

SZZ: qui c'era un articolo sull'argomentohttps://www.mql5.com/ru/articles/1561

Quindi il compito è quello di determinare di quante cifre x è normalizzato. Quindi va bene. A meno che tu non fossi troppo pigro per scrivere una scala del genere.

 
Dmitry Fedoseev:

A meno che tu non fossi troppo pigro per scrivere una scala del genere.

Si può fare senza scala, ma ci vuole il 10% di tempo in più.

int dtd2(double f)
 {
  f/=0.0000001;
  int d = 0, i = 10000000;
 
  while( d < 7 && int( fmod( f, i ) ) > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

Si può fare senza scala, ma ci vuole il 10% di tempo in più.

Questo: f/=0.0000001; è discutibile.