Double vs FLOAT - error MathFloor poco claro - página 4

 
Andrey Dik:
La flotación es la castración de los números y no ofrece ninguna ventaja. Es mejor hacer frente a todas las pérdidas en las conversiones y utilizar la mayor precisión posible: el doble.
Gracias. Intentaré averiguar en qué me he equivocado. Por ahora el flotador sigue funcionando también. No tengo la costumbre de abandonar lo que he empezado. Pero este error me descolocó.
 
Vladislav Andruschenko:
Gracias. Intentaré averiguar dónde estuvo mi error. Mientras tanto, el flotador funciona. No estoy acostumbrado a renunciar. Pero este error me desconcertó.
Depende de usted, pero tenga en cuenta que TODAS las funciones matemáticas estándar funcionan con números dobles y producen resultados dobles. La aplicación de estas funciones a números flotantes produce una conversión interna a doble, por lo que se perderá la precisión y la validez de los resultados de todos modos.

Personalmente, nunca uso en los cálculos y comparaciones de números el método que compara la diferencia con algún valor mínimo aceptado, siempre trabajo con la máxima precisión posible hasta el 16º signo, y sólo en la última operación hago la normalización. Si manejas correctamente el doble no hay problema, lo cual te aconsejo que hagas, de lo contrario te encontrarás con problemas de distorsión de los resultados asociados a una pérdida de precisión en uno de los pasos de los cálculos/conversiones.
 
Andrey Dik:
Depende de ti, pero ten en cuenta que TODAS las funciones matemáticas estándar funcionan con números dobles y dan resultados dobles. La aplicación de estas funciones a números flotantes sigue siendo una conversión interna a doble, por lo que, en cualquier caso, se perderá precisión y validez en los resultados obtenidos.

Personalmente, nunca uso en los cálculos y comparaciones de números el método que compara la diferencia con algún valor mínimo aceptado, siempre trabajo con la máxima precisión posible hasta el 16º signo, y sólo en la última operación hago la normalización. Si trabajas con el doble correctamente no hay problemas, cosa que te aconsejo, de lo contrario te encontrarás con problemas de distorsión de los resultados asociados a una pérdida de precisión en uno de los pasos de los cálculos/conversiones.
Gracias por su exhaustiva respuesta.
 

el precio de la calificación en 2017 es descaradamente correcto

no son las polillas, es el estiércol...

 
Mikhail Dovbakh:

el precio de la calificación en 2017 es descaradamente correcto

Cuéntanos.
 

así es como debe ser

double Averab=(Ask+Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
 
Taras Slobodyanik:

debería ser así.

double Averab=MathAbs(Ask-Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;


Has cambiado tu código varias veces.

Yo hice lo mismo, experimenté, entendí lo que son double e int, pero cuando calculé explícitamente no eran lo que necesitaba.

La primera línea es la que has sugerido.

MathFloor( NormalizeDouble((Ask+Bid)/Point,_Digits) )*Point
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: MathFloor=2.10287
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE    askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: FLOAT    askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870
 

así que es correcto105143.5000000000 redondeado a 43...

(46-41)/2 = 2,5, redondeado hacia abajo = 2

 
Taras Slobodyanik:

así que es correcto105143.5000000000 redondeado a 43...

(46-41)/2 = 2,5, redondeado hacia abajo = 2


así es,

pero con diferentes diferenciales (2,3,4,5,6,7) el redondeo hacia abajo es diferente y a veces no es del todo preciso.

 
Comprobado de 0 a 8 todo está bien...