Arrotondamento dei numeri in MT4 tramite NormalizeDouble - pagina 14

 

Ha fatto funzioni per arrotondare il fondo e la parte superiore una volta

Potrebbe aiutare qualcuno

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

Ha fatto funzioni per arrotondare il fondo e la parte superiore una volta

Potrebbe aiutare qualcuno

Grazie, lo prenderò per la mia collezione.
 
lilita bogachkova:

cerca di ottenere un risultato di0,999999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0.999999999999999-0.9999999999999

9*X = 9*0.99999999999999999

otteniamo 9*X = 9 o X è uguale a 1 (uno)

v1 = (1/3) = 0,3333333333 | v2 = 3*(1/3) = 1,00000000

o 0,99999999999999999 = 1,0

v1 (1.00000000) >= 1.0

In questo caso, 0,9999999999999999999999 rappresenta 1,0. Ma il compito è quello di "scartare", quindi il risultato deve includere dei nove.
 

Grazie a tutti per l'utile thread!

Ho scelto la soluzione di arrotondare 1 cifra in più tramiteNormalizeDouble, e poi tagliare l'ultima cifra. Finora, è completamente adatto.

 

Ancora sull'arrotondamento......

Per favore consigliatemi sulla situazione (non tirate pomodori, sono un umanitario),

esiste una tale variabile:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Il delta è originariamente normalizzato,

OrderLots dovrebbe probabilmente restituire dubs normalizzati,

ma in qualche modo a volte in rare occasioni ottengo numeri come 2.775557561562891e-17

Quindi è quasi zero ma non zero.......

prima domanda - è normale?

seconda domanda - come ho capito sarà sufficiente per me fare la seconda normalizzazione per evitare le code?

Terza domanda (sento che non la capirò comunque, ma la faccio lo stesso):

l'addizione di due numeri normalizzati può dare numeri non normalizzati?

P.S. Mi scuso per aver sollevato di nuovo la questione, ma non ho la forza di rileggere tutto di nuovo


 
transcendreamer:

Ancora sull'arrotondamento......

Per favore consigliatemi sulla situazione (non tirate pomodori, sono un umanitario),

esiste una tale variabile:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Il delta è originariamente normalizzato,

OrderLots dovrebbe probabilmente restituire dubs normalizzati,

ma in qualche modo a volte in rare occasioni ottengo numeri come 2.775557561562891e-17

Quindi è quasi zero ma non zero.......

prima domanda - è normale?

seconda domanda - come ho capito sarà sufficiente per me fare la seconda normalizzazione per evitare le code?

Terza domanda (sento che non la capirò comunque, ma la faccio lo stesso):

l'addizione di due numeri normalizzati può dare numeri non normalizzati?

P.S. Scusatemi se lo ripropongo, ma non ho l'energia per rileggerlo tutto.

  1. Sì.
  2. Sì.
  3. Sì.
 
fxsaber:
  1. Sì.
  2. Sì.
  3. Sì.
Grazie
 
transcendreamer:

P.S. Mi scuso per aver sollevato di nuovo la questione, ma non ho l'energia per ripercorrere tutto di nuovo

È meglio controllare da soli con diversi esempi, vi darà una comprensione.

L'unica cosa è che lo sto facendo male:

if(delta>0)

ma così.

if(delta>0.0)

Per i numeri doppi. Non so se conta davvero, ma non ho mai incontrato un errore con la mia variante (cerco di confrontare solo gli stessi tipi di variabili).

 
Andrey Dik:

Non so se ha davvero importanza, ma non ho mai incontrato un errore con la mia versione (cerco solo di confrontare gli stessi tipi di variabili).

Non è così.
 
Alcuni numeri possono essere rappresentati solo come una frazione infinita, per esempio 1/3 nel sistema decimale. Ma 1/3 non è una frazione infinita nel sistema terziario, lì == 0,1. Cioè, diversi sistemi numerici hanno le loro frazioni infinite. Di conseguenza, una frazione non infinita in decimale può essere uno in binario. Per esempio: 0.1, 0.2, 0.3, 0.4, ... non hanno una rappresentazione binaria esatta. Se chiamate NormalizeDouble dieci volte, sarà o 0,19999999999...1 o 0,200000...1. Non so, forse questa è una novità.