Arredondamento de números em MT4 via NormalizeDouble - página 4

 
Dmitry Fedoseev:
Isto porque é 0,6, portanto 0,5 só é obtido através de batota.

double v1 = 1.1234567;

Se 'v1' for inserido em qualquer número, então ele mostra que é arredondado corretamente para 'i = 2'.

 
lilita bogachkova:

Se 'v1' for inserido em qualquer número, então você pode ver que até 'i = 2' tudo é arredondado corretamente.

É errado depois de i = 2?
 
Ihor Herasko:

Quando apenas um dígito é normalizado, é simples: 0, 1, 2, 3, 4 -> 0, e 5, 6, 7, 8, 9 -> 1.

Quando dois dígitos são normalizados, são levados em conta números de dois dígitos: 0 - 49 -> 0, e 50 - 99 -> 1. Afinal, se o número 1,49 tem que ser arredondado para números inteiros, será que realmente temos que obter 2, que é 51 centésimos contra os 49 centésimos disponíveis de distância para 1?

É a mesma coisa com três dígitos, quatro dígitos, etc.

Mas a 1,45 é arredondada para 2, mas somente se tiver sido normalizada previamente com um grau de precisão superior.

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

Acontece que se nos cálculos do número foi normalizado para uma maior precisão e nos cálculos subseqüentes para normalizar o número para uma precisão menor, resultará em uma precisão diferente da simples normalização deste número para uma precisão menor.


 
lilita bogachkova:

Acontece que se no cálculo o número foi normalizado com maior precisão e nos cálculos subsequentes o número é normalizado com menor precisão, o resultado é diferente de apenas normalizar o número para uma precisão menor.


Acima de tais ações são chamadas de "trapaças")) A matemática, embora seja uma ciência exata, ainda deve ser aplicada com compreensão. 2 + 3 = 5, mas se 2 baldes mais 3 frangos, então 5 não funcionarão ))
 

Desculpe-me, mas como você obtém os valores que deseja?

Se eu usar as funções recomendadas, então:

- Em um caso eu recebo o valor corretamente arredondado
0,06-0,02 =NormalizeDouble(0,0399999999999999999,2) = 0,04
A divisão é aproximada e a normalização é necessária.

- No segundo caso, eu também recebo arredondamento, mas não é necessário neste caso
0,06-0,024 = NormalizeDouble(0,036,2) = 0,04
A normalização (arredondamento) não é necessária aqui.

Mas como posso normalizar em vez de arredondar?

 
Roman Starinskij:

Desculpe-me, mas como você obtém os valores que deseja?

Para isso, vale apenas a pena formular quais são os "valores certos". ))

Se eu usar as funções recomendadas, então:

- Em um caso eu recebo um valor devidamente arredondado
0,06-0,02 = NormalizeDuplo(0,039999999999999999999,2) = 0,04
A divisão é aproximada e não se pode passar sem normalização.

- No segundo caso, também tenho direito a arredondamento, mas não é necessário neste caso
0,06-0,024 = NormalizeDuplo(0,036,2) = 0,04
A normalização (arredondamento) não é necessária aqui.

Mas como posso normalizar corretamente, em vez de arredondar os valores?

O exemplo acima mostra que você está usando algum algoritmo intuitivo que determina a "retidão" da normalização. No primeiro caso, é uma fração infinita, enquanto no segundo caso é finita. Ajuste seu algoritmo para converter o número real para a forma desejada.

Embora seja a maneira mais fácil - decidir antecipadamente sobre a precisão necessária dos cálculos.

 
Ihor Herasko:

Para fazer isso, vale simplesmente a pena formular quais são os "valores certos". ))

Pelo exemplo acima, você pode ver que está usando algum algoritmo intuitivo, pelo qual você determina a "necessidade" de normalização. No primeiro caso, é uma fração infinita, enquanto no segundo caso é finita. Ajuste seu algoritmo para converter o número real para a forma desejada.

Embora a maneira mais fácil seja decidir antecipadamente qual precisão você precisa.


Eu só preciso obter os mesmos números, que eu costumava obter na calculadora. :-) Estes são os valores que você precisa.
Assim, com "0,06-0,02" você recebe "0,04" e com "0,06-0,024" você recebe "0,036".
 
Roman Starinskij:

Eu só preciso obter os mesmos números que estou acostumado a obter em uma calculadora. :-) Estes são os valores que você precisa.
Se você quiser "0.06-0.02" você receberá "0.04" e se você quiser "0.06-0.024" você receberá "0.036".
Se você quiser obter 0,036 (3 casas decimais), você precisa normalizar para 3 casas decimais, não 2.
 
Dmitry Fedoseev:
Se você quiser 0,036 (3 casas decimais), normalize para 3, e não 2.

Eu estava errado, até 3 dígitos deveriam ser normalizados. É possível fazer isso?

 
Roman Starinskij:

Eu estava errado, até 3 dígitos deveriam ser normalizados. Será que vai funcionar dessa maneira?

Aqui está o seu código:

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

Em vez de 2, coloque 3 e é 0,036.