Obtener el número de decimales de cualquier número (no sólo las comillas) evitando Digits() en MQL4 y MQL5 - página 12

 
Ilya Malev:

Esta es probablemente la mejor solución

no es correcto comparar dobles en igualdad, además, la tarea es ser exacto al signo

Mira el archivo stdlib.mq4 en MT4, había un ejemplo de comparación doble correcta

CompararDos()

SZZ: aquí hay un artículo sobre el temahttps://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Me pregunto cómo contarás logaritmos, potencias con números no enteros, usarás la trigonometría, .... utilizar bibliotecas de terceros, indicadores... Todos tienen errores.

Si necesita una precisión supermega, puede utilizar bibliotecas externas especiales como gnu mp

De lo contrario, si necesita una precisión garantizada (cuando en cada operación se calcula el error), puede utilizar todo tipo de "librerías de intervalo".

si incluso eso no es suficiente - puede utilizar polinomios en lugar de dígitos

pero nunca he visto esos casos, cuando esos circuitos se utilizan realmente en MT:-)

hay un doble para el ojo :-)

 
Igor Makanu:

no es correcto comparar dobles en igualdad, además, la tarea es ser exacto a un signo

Mira el archivo stdlib.mq4 en MT4, había un ejemplo de comparación doble correcta

CompararDos()

Pues bien, el tiempo de ejecución con CompareDoubles se multiplica por 2. Entonces es mejor así:

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:

Bueno, bueno, y el tiempo de ejecución con CompareDoubles se multiplica por dos. Será mejor que lo hagas así:

Estamos hablando de un cálculo correcto, no puedo comprobar tu código ahora, pero no es difícil, tienes que comparar tu ejemplo con un ejemplo usando DoubleToStr() en el bucle, si no hay diferencia, entonces todo es correcto

ZS: He intentado con fmod() creo que he publicado un ejemplo, no funciona correctamente, como en 0,07 debe comprobar - inmediatamente un error apareció

 
Igor Makanu:

Estamos hablando de un cálculo correcto, no puedo comprobar tu código ahora, pero no es difícil, tienes que comparar tu ejemplo con el que utiliza DoubleToStr() en el bucle, si no hay diferencia, entonces todo es correcto

Ya lo he comprobado y calculado la velocidad y es la mejor manera. A menos que necesite buscar más de 7 caracteres, por supuesto.

S.s. 0,7 y 0,07 y 500000000,0001, etc. todo calculado correctamente.

s.s. Pero para 500000000.9991, se maneja peor. Pero eso apenas importa en la práctica del mercado de divisas.

 
Ilya Malev:

Pero en la práctica del mercado de divisas esto apenas tiene importancia.

depende del problema. si se trata de órdenes comerciales, entonces este problema no tiene sentido - los precios se normalizan a Dígitos, mientras que los lotes son relativos al lote mínimo

Si el problema es de modelización matemática, puede ser útil.

 
Igor Makanu:

depende del problema, si es para órdenes de comercio, entonces esta tarea no tiene sentido en absoluto - los precios están normalizados a Dígitos, y los lotes son relativos al lote mínimo

Si la tarea es de modelización matemática, puede ser útil.

Por supuesto, no para escribir redes neuronales =)) y decir, es conveniente almacenar los precios/lotes/dinero como un entero de 4 bytes con valor decimal, reduciendo el tamaño de los datos en 2 veces.

 
Igor Makanu:

no es correcto comparar dobles en igualdad, además, la tarea es ser exacto a un signo

Mira el archivo stdlib.mq4 en MT4, había un ejemplo de comparación doble correcta

CompararDos()

SZZ: aquí había un artículo sobre el temahttps://www.mql5.com/ru/articles/1561

Así que la tarea consiste en determinar por cuántos dígitos se normaliza x. Así que está bien. A no ser que fueras demasiado vago para escribir tal escalera.

 
Dmitry Fedoseev:

A no ser que fueras demasiado vago para escribir tal escalera.

Se puede hacer sin escalera, pero se tarda un 10% más.

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:

Se puede hacer sin escalera, pero se tarda un 10% más.

Este: f/=0,0000001; es cuestionable.