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

 

Realiza funções para arredondar a parte inferior e superior uma vez

Pode ajudar alguém

//+------------------------------------------------------------------+
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:

Realiza funções para arredondar a parte inferior e superior uma vez

Pode ajudar alguém

Obrigado, vou buscá-lo para minha coleção.
 
lilita bogachkova:

tente obter um resultado de0,9999999999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,9999999999999999999-0,99999999999999999

9*X = 9*0.99999999999999999

obtemos 9*X = 9 ou X igual a 1 (um)

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

ou 0,9999999999999999999 = 1,0

v1 (1.00000000) >= 1.0

Neste caso, 0,999999999999999999999999 representa 1,0. Mas a tarefa é "descartar", portanto o resultado deve incluir noves.
 

Obrigado a todos pela ajuda!

Eu escolhi a solução de arredondar mais 1 dígito viaNormalizeDouble, e depois aparar o último dígito. Até agora, é completamente adequado.

 

Novamente sobre arredondamento......

Por favor, informe sobre a situação (não jogue tomates, eu sou um humanitário),

existe tal variável:

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

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

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

O delta é originalmente normalizado,

A OrderLots provavelmente deveria retornar dublagens normalizadas,

mas de alguma forma, às vezes, em raras ocasiões eu recebo números como 2,77555557561561562891e-17

Portanto, é quase zero, mas não zero.......

primeira pergunta - isto é normal?

segunda pergunta - como entendo, será suficiente para mim fazer a segunda normalização para evitar rabos?

Terceira pergunta (sinto que não vou entender de qualquer forma, mas vou perguntar de qualquer forma):

a adição de dois números normalizados pode dar números não-normalizados?

P.S. Peço desculpas por falar nisso novamente, mas não tenho forças para reler tudo novamente.


 
transcendreamer:

Novamente sobre arredondamento......

Por favor, informe sobre a situação (não jogue tomates, eu sou um humanitário),

existe tal variável:

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

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

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

O delta é originalmente normalizado,

A OrderLots provavelmente deveria retornar dublagens normalizadas,

mas de alguma forma, às vezes, em raras ocasiões eu recebo números como 2,77555557561561562891e-17

Portanto, é quase zero, mas não zero.......

primeira pergunta - isto é normal?

segunda pergunta - como entendo, será suficiente para mim fazer a segunda normalização para evitar rabos?

Terceira pergunta (sinto que não vou entender de qualquer forma, mas vou perguntar de qualquer forma):

a adição de dois números normalizados pode dar números não-normalizados?

P.S. Desculpe-me por falar nisso novamente, mas eu não tenho energia para reler tudo

  1. Sim.
  2. Sim.
  3. Sim.
 
fxsaber:
  1. Sim.
  2. Sim.
  3. Sim.
Obrigado
 
transcendreamer:

P.S. Peço desculpas por falar nisso novamente, mas não tenho energia para passar por tudo isso novamente

É melhor verificar você mesmo com exemplos diferentes, isso lhe dará um entendimento.

A única coisa é que estou fazendo isso errado:

if(delta>0)

mas assim.

if(delta>0.0)

Para números duplos. Não sei se isso realmente importa, mas nunca encontrei um erro com minha variante (tento comparar apenas os mesmos tipos de variáveis).

 
Andrey Dik:

Não sei se isso realmente importa, mas nunca encontrei um erro com minha versão (apenas tento comparar os mesmos tipos de variáveis).

Não tem.
 
Alguns números só podem ser representados como uma fração infinita, por exemplo, 1/3 no sistema decimal. Mas 1/3 não é uma fração infinita no sistema terciário, aí ele == 0,1. Ou seja, sistemas de números diferentes têm suas próprias frações infinitas. Conseqüentemente, uma fração não infinita em decimal pode ser uma fração em binário. Por exemplo: 0,1, 0,2, 0,3, 0,4, ... não têm representação binária exata. Se você ligar para NormalizeDouble dez vezes, será 0,19999999999...1 ou 0,200000...1. Não sei, talvez isto seja novidade.