Arrotondamento dei numeri in MT4 tramite NormalizeDouble - pagina 4

 
Dmitry Fedoseev:
Questo perché è 0,6, quindi 0,5 si ottiene solo barando.

double v1 = 1.1234567;

Se 'v1' è inserito in qualsiasi numero, allora mostra che è arrotondato correttamente a 'i = 2'.

 
lilita bogachkova:

Se 'v1' viene inserito in un numero qualsiasi, allora si può vedere che fino a 'i = 2' tutto viene arrotondato correttamente.

È sbagliato dopo i = 2?
 
Ihor Herasko:

Quando una sola cifra è normalizzata, è semplice: 0, 1, 2, 3, 4 -> 0, e 5, 6, 7, 8, 9 -> 1.

Quando si normalizzano due cifre, vengono presi in considerazione i numeri a due cifre: 0 - 49 -> 0, e 50 - 99 -> 1. Dopo tutto, se il numero 1,49 deve essere arrotondato a numeri interi, dobbiamo davvero ottenere 2, che è 51 centesimi contro i 49 centesimi disponibili per 1?

È lo stesso con le tre cifre, le quattro cifre, ecc.

Ma 1,45 è arrotondato a 2, ma solo se è stato precedentemente normalizzato a un grado di precisione superiore.

void OnStart()
  {
   for(int i=7;i>=0;i--)
     {
      double v1 = 1.4545454;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }


v1 = 0 = 1.0000000, v2 = 0 = 2.0000000

v1 = 1 = 1.5000000, v2 = 1 = 1.5000000

v1 = 2 = 1.4500000, v2 = 2 = 1.4600000

v1 = 3 = 1.4550000, v2 = 3 = 1.4550000

si scopre che se nei calcoli del numero è stato normalizzato ad una precisione superiore e nei calcoli successivi per normalizzare il numero ad una precisione inferiore si tradurrà in un diverso dal semplicemente normalizzato questo numero ad una precisione inferiore.


 
lilita bogachkova:

si scopre che se nel calcolo il numero è stato normalizzato con una precisione maggiore e nei calcoli successivi il numero viene normalizzato con una precisione minore, il risultato è diverso dalla semplice normalizzazione del numero con una precisione minore.


Sopra tali azioni sono chiamate "barare")) La matematica, sebbene sia una scienza esatta, deve comunque essere applicata con comprensione. 2 + 3 = 5, ma se 2 secchi più 3 polli, allora 5 non funzionerà ))
 

Mi scusi, ma come ottiene i valori che vuole?

Se uso le funzioni raccomandate, allora:

- In un caso ottengo un valore correttamente arrotondato
0.06-0.02 =NormalizeDouble(0.03999999999999999,2) = 0.04
La divisione è approssimata e la normalizzazione è necessaria.

- Nel secondo caso, ottengo anche l'arrotondamento, ma non è necessario in questo caso
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
La normalizzazione (arrotondamento) non è necessaria qui.

Ma come faccio a normalizzare invece di arrotondare?

 
Roman Starinskij:

Mi scusi, ma come ottiene i valori che vuole?

Per questo, vale solo la pena di formulare quali sono i "valori giusti" ))

Se uso le funzioni raccomandate, allora:

- In un caso ottengo un valore correttamente arrotondato
0.06-0.02 = NormalizeDouble(0.03999999999999999,2) = 0.04
La divisione è approssimativa e non si può fare a meno della normalizzazione.

- Nel secondo caso, ottengo anche l'arrotondamento, ma non è necessario in questo caso
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
La normalizzazione (arrotondamento) non è necessaria in questo caso.

Ma come faccio a normalizzare correttamente, invece di arrotondare i valori?

L'esempio sopra mostra che stai usando qualche algoritmo intuitivo che determina la "giustezza" della normalizzazione. Nel primo caso, è una frazione infinita, mentre nel secondo caso è una frazione finita. Aggiusta il tuo algoritmo per convertire il numero reale nella forma desiderata.

Anche se il modo più semplice - decidere in anticipo sulla precisione richiesta dei calcoli.

 
Ihor Herasko:

Per fare questo, vale semplicemente la pena di formulare quali sono i "valori giusti ))

Dall'esempio precedente, potete vedere che state usando un qualche algoritmo intuitivo, con il quale determinate la "necessità" della normalizzazione. Nel primo caso, è una frazione infinita, mentre nel secondo caso è una frazione finita. Aggiusta il tuo algoritmo per convertire il numero reale nella forma desiderata.

Anche se il modo più semplice è decidere in anticipo di quale precisione avete bisogno.


Ho solo bisogno di ottenere gli stessi numeri, che ho usato per ottenere nella calcolatrice. :-) Questi sono i valori di cui avete bisogno.
Così, con "0.06-0.02" si ottiene "0.04" e con "0.06-0.024" si ottiene "0.036".
 
Roman Starinskij:

Ho solo bisogno di ottenere gli stessi numeri che sono abituato a ottenere in una calcolatrice. :-) Questi sono i valori di cui avete bisogno.
Se volete "0.06-0.02" avrete "0.04" e se volete "0.06-0.024" avrete "0.036".
Se volete ottenere 0,036 (3 cifre decimali), dovete normalizzare a 3 cifre decimali, non a 2.
 
Dmitry Fedoseev:
Se volete 0,036 (3 cifre decimali), normalizzate a 3, non a 2.

Mi sono sbagliato, fino a 3 cifre dovrebbero essere normalizzate. È possibile farlo?

 
Roman Starinskij:

Mi sono sbagliato, fino a 3 cifre dovrebbero essere normalizzate. Funzionerà così?

Ecco il tuo codice:

0.06-0.024 = NormalizeDouble(0.036,2) = 0.04

Invece di 2, metti 3 ed è 0,036.