Tengo un sobresaliente en teoría, en cómo trabajar con el doble y demás. El algoritmo NormalizeDouble contiene un error. El tema planteado sólo está relacionado indirectamente con la comparación de dobles.
La imagen muestra el valor de la variable no normalizada n y el de la variable normalizada m y lo diferentes que son. Pero si quieres comparar tangas, es tu preferencia.
fxsaber:
Conozco la teoría, cómo trabajar con el doble y cosas así en una escala A+. El algoritmo NormalizeDouble contiene un error. El tema planteado sólo está relacionado indirectamente con la comparación de dobles.
Definitivamente no puede prescindir de la explicación de Semko aquí.
NormalizeDouble es sólo un cierto algoritmo que se aplica a un número doble. Lamentablemente, hay un error en él. Si se corrige, el error desaparecerá. La doble representación de todos los demás no cambiará en absoluto.
fxsaber: NormalizeDouble es sólo un cierto algoritmo que se aplica a un número doble. Lamentablemente, hay un error en él. Si se corrige, el error desaparecerá. Todas las demás representaciones dobles no cambiarán por ello.
Creo que no se trata de la función, sino de que las constantes no están normalizadas por el compilador (aunque deberían estarlo).
Entonces las mismas constantes en DLL y MQL no coincidirán.
También es cierto. Además, cualquier normalización supone una pérdida de precisión, así que puede que me haya pasado con la normalización de las constantes.
En general, este problema, en mi opinión, no tiene una solución inequívoca, aunque en realidad no lo es.
Alexey Navoykov: También es cierto. Además, cualquier normalización supone una pérdida de precisión, así que puede que me esté pasando con la normalización constante.
En general, este problema no me parece que tenga una solución inequívoca, aunque en esencia no lo sea.
Sólo hay que modificar el algoritmo de normalización actual.
Ni siquiera sé si se trata de un error en el algoritmo. Realmente, no se pueden comparar los dobles. Sólo una regla dura. O, como dice Slava, a través de épsilon o a través de la multiplicación (por ejemplo, por 1/_Punto) con conversión a int con redondeo.
Sólo el redondeo no se realiza con round(), ceil(), floor() ya que también devuelven double.
O a través de estos, sobre todo porque funcionan más rápido que los normales:
int Ceil (double x) {return (x-(int)x>0)?(int)x+1:(int)x;}
int Round(double x) {return (x>0)?(int)(x+0.5):(int)(x-0.5);}
int Floor(double x) {return (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x;}
Más fácil y rápido, por supuesto, a través de epsilon:
la normalización no es un redondeo
Tengo un sobresaliente en teoría, en cómo trabajar con el doble y demás. El algoritmo NormalizeDouble contiene un error. El tema planteado sólo está relacionado indirectamente con la comparación de dobles.
Repito mi pregunta.
La imagen muestra el valor de la variable no normalizada n y el de la variable normalizada m y lo diferentes que son. Pero si quieres comparar tangas, es tu preferencia.
Conozco la teoría, cómo trabajar con el doble y cosas así en una escala A+. El algoritmo NormalizeDouble contiene un error. El tema planteado sólo está relacionado indirectamente con la comparación de dobles.
El algoritmo NormalizeDouble contiene un error.
sí
Creo que A100 escribió sobre ello
pero los desarrolladores desde MQL se han ceñido a esta "característica", por desgracia
Si lo corrigen, el error desaparecerá.
Creo que aparecerán otros fallos y habrá mucho ruido ))))
No lo harán, porque casi todo el mundo compara incluso los doblajes normalizados a través de la normalización. Es decir, lo ponen donde quieren.
Una normalización adecuada debería dar siempre resultado en esta condición.
Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias
Errores, fallos, preguntas
fxsaber, 2020.08.10 11:37
Esta es la única comprobación de que la normalización es correcta. Si siempre dará la razón, nada se romperá.
NormalizeDouble es sólo un cierto algoritmo que se aplica a un número doble. Lamentablemente, hay un error en él. Si se corrige, el error desaparecerá. Todas las demás representaciones dobles no cambiarán por ello.
Creo que no se trata de la función, sino de que las constantes no están normalizadas por el compilador (aunque deberían estarlo).
Entonces las mismas constantes en DLL y MQL no coincidirán.
Entonces las mismas constantes en DLL y MQL no coincidirán.
También es cierto. Además, cualquier normalización supone una pérdida de precisión, así que puede que me esté pasando con la normalización constante.
Sólo hay que modificar el algoritmo de normalización actual.
Sólo hay que modificar el algoritmo de normalización actual.
Ni siquiera sé si se trata de un error en el algoritmo.
Sólo el redondeo no se realiza con round(), ceil(), floor() ya que también devuelven double.Realmente, no se pueden comparar los dobles. Sólo una regla dura.
O, como dice Slava, a través de épsilon o a través de la multiplicación (por ejemplo, por 1/_Punto) con conversión a int con redondeo.
O a través de estos, sobre todo porque funcionan más rápido que los normales:
Más fácil y rápido, por supuesto, a través de epsilon: