Obter o número de casas decimais de quaisquer números (não apenas citações) contornando Dígitos() em MQL4 e MQL5 - página 12

 
Ilya Malev:

Esta é provavelmente a melhor solução

não é correto comparar as duplas em igualdade, além disso, a tarefa é ser exata com o sinal

Veja o arquivo stdlib.mq4 em MT4, houve um exemplo de comparação dupla correta

CompareDuas()

SZZ: aqui está um artigo sobre o assuntohttps://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Pergunto-me como você fará logaritmos, exponenciação com números não inteiros, trigonometria, .... usar bibliotecas de terceiros, indicadores... Todos eles têm erros!

Se você precisa de super-mega precisão, você pode usar bibliotecas externas especiais como gnu mp

Caso contrário, se você precisar de precisão garantida (quando em cada operação o erro é calculado), você deve usar todos os tipos de "interval libs".

se mesmo isso não for suficiente - você pode usar polinômios em vez de dígitos

mas nunca vi tais casos, quando tais circuitos são realmente utilizados em MT:-)

há um duplo para o olho :-)

 
Igor Makanu:

não é correto comparar as duplas em igualdade, além disso, a tarefa é ser exata com um sinal

Veja o arquivo stdlib.mq4 em MT4, houve um exemplo de comparação dupla correta

CompareDuas()

Bem, o tempo de execução com CompareDoubles sobe por um fator de 2. Então é melhor assim:

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:

Bem, bem, e o tempo de execução com CompareDoubles sobe por um fator de dois. É melhor fazer desta maneira:

Estamos falando de cálculo correto, não posso verificar seu código agora, mas não é difícil, você precisa comparar seu exemplo com um exemplo usando DoubleToStr() no laço, se não houver diferença, então tudo está correto

ZS: Eu tentei com fmod() Eu acho que postei um exemplo, não funciona corretamente, como em 0.07 deve verificar - imediatamente um bug apareceu

 
Igor Makanu:

Estamos falando de cálculo correto, não posso verificar seu código agora, mas não é difícil, você precisa comparar seu exemplo com o exemplo usando DoubleToStr() no laço, se não houver diferença, então tudo está correto

Já o verifiquei e calculei a velocidade e é a melhor maneira. A menos que você precise procurar por mais de 7 caracteres, é claro.

S.s. 0.7 e 0.07 e 500000000.0001, etc., todos calculados corretamente.

s.s. Mas, para 500000000.9991, ele lida pior. Mas isso dificilmente importa na prática cambial.

 
Ilya Malev:

Mas na prática cambial, isto não é importante.

depende do problema. se é para ordens comerciais, então este problema não tem sentido - os preços são normalizados para Dígitos, enquanto os lotes são relativos ao lote mínimo

Se o problema é com a modelagem matemática, pode ser útil.

 
Igor Makanu:

depende do problema, se é para ordens de negociação, então essa tarefa não tem sentido algum - os preços são normalizados para Dígitos, e os lotes são relativos ao lote mínimo

Se a tarefa for com modelagem matemática, ela pode ser útil.

É claro, não escrever redes neurais =))) e dizer, é conveniente armazenar preços/lotes/money como um inteiro de 4 bytes com valor decimal, reduzindo o tamanho dos dados em 2 vezes.

 
Igor Makanu:

não é correto comparar as duplas em igualdade, além disso, a tarefa é ser exata com um sinal

Veja o arquivo stdlib.mq4 em MT4, houve um exemplo de comparação dupla correta

CompareDuas()

SZZ: aqui estava um artigo sobre o assuntohttps://www.mql5.com/ru/articles/1561

Portanto, a tarefa é determinar por quantos dígitos x é normalizado. Portanto, está tudo bem. A menos que você fosse preguiçoso demais para escrever tal escada.

 
Dmitry Fedoseev:

A menos que você fosse preguiçoso demais para escrever tal escada.

Você pode fazê-lo sem escada, mas isso leva 10% mais tempo.

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:

Você pode fazê-lo sem escada, mas isso leva 10% mais tempo.

Este: f/=0,0000001; é questionável.

Razão: