Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Obsoleto
La biblioteca estándar dispone de una función de normalización de precios que tiene en cuenta la granularidad
La biblioteca estándar dispone de una función de normalización de precios que tiene en cuenta la granularidad
Estaba empezando a adivinar que NormalizeDouble(new_lot-sum_lots,Lots_Digits); no da como resultado exactamente 0 y almacena alguna cola
Si las variables nuevo_lote y suma_lote son iguales, entonces la diferencia es exactamente 0. Pero no se sabe cómo se calculan, puede que efectivamente sean desiguales al calcularse, de ahí la diferencia no nula. Haz lo mismo de esta manera:
NormalizarDoble(lote_nuevo, lotes_dígitos) - NormalizarDoble(suma_lotes, lotes_dígitos).
Si las variables son iguales dentro del número de dígitos especificado, la diferencia será estrictamente 0.
Si las variables nuevo_lote y suma_lote son iguales, entonces la diferencia es exactamente 0. Pero no se sabe cómo se calculan, puede que efectivamente sean desiguales al calcularse, de ahí la diferencia no nula. Haz lo mismo de esta manera:
NormalizarDoble(lote_nuevo, lotes_dígitos) - NormalizarDoble(suma_lotes, lotes_dígitos).
Si las variables son iguales dentro del número de dígitos especificado, la diferencia será estrictamente 0.
De nuevo sobre el redondeo......
Por favor, asesórese sobre la situación (no tire tomates, soy humanitario),
existe dicha variable:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
El delta está originalmente normalizado,
Probablemente, OrderLots debería devolver dubs normalizados,
pero de alguna manera a veces en raras ocasiones obtengo números como 2.775557561562891e-17
Así que es casi cero pero no cero.......
primera pregunta - ¿es esto normal?
...
Lo he vuelto a leer con atención. No es normal. Si la función NormalizeDouble:
- Se selecciona la parte entera - I
- Se selecciona la parte fraccionaria - F
- F = F * 10^dígitos
- F = F (+ o - según el signo) 0,5
- F = (parte entera de F) / 10^dígitos
- resultado = I + F
entonces también el resultado deNormalizeDouble(new_lot - sum_lots, Lots_Digits) debe ser estrictamente cero si new_lot y sum_lots son iguales dentro del número de dígitos especificado. En raros casos puede haber una diferencia de 1 en el último dígito (la razón está en los puntos 4 y 5), pero el resultado 2,775557561562891e-17 es extraño, no debería serlo.Escribí un pequeño código tutorial (me interesaba husmear por mi cuenta) que da a conocer las entrañas de un número flotante. Si alguien está interesado, puede ejecutarlo (código C++, puede utilizar algún compilador online. Aquí https://goo.gl/tP691X, por ejemplo)
La salida en f == 0,5 + 1/(2^24). 1/(2^24) es el dígito menos significativo de la mantisa en un grado determinado:
Grado = 126 - 127 = -1
mantisa = 1.0000000000000000000000001
Desplazar la mantisa al grado -1 = 0,100000000000000001 = 1^(-1) + 1^(-24) = 1/(2^1) + 1/(2^24) = 0,5 + 0,00000005960464478 = 0,50000005960464478
Como teoría https://habrahabr.ru/post/112953/.
SZZ: este compilador en línea es más agradable que http://rextester.com/l/cpp_online_compiler_gcc
Escribí un pequeño código tutorial (me interesaba husmear por mi cuenta) que da a conocer las entrañas de un número flotante. Si alguien está interesado, puede ejecutarlo (código C++, puede utilizar algún compilador online. Aquí https://www.tutorialspoint.com/compile_cpp11_online.php, por ejemplo)
También puedes ejecutarlo en MQL5 - sustituye c[Pos] por _R(f)[(char)Pos] (o _R(f).Bytes[Pos]) conectando esta librería.
SZ
Resultado
¿Qué pasó con la mantisa?
32 es el código ascii del problema. Parece que la biblioteca con el error no tiene una versión char. Creo que hay que eliminar los problemas entre los valores de las mantisas. ¿O tal vez en lugar de ' ' escribir " "?
¿Qué pasó con la mantisa?
32 es el código ascii del problema. Parece una biblioteca con un error. Creo que hay que eliminar los problemas entre los valores de las mantisas. ¿O tal vez en lugar de ' ' escribir " "?
El fmtprntl.mqh no es mío, así que no puedo asegurarlo.
No quiero molestar, así que para sus valores de bytes impresos f
Un efecto secundario relacionado.
Resultó ser conveniente. Pero originalmente no estaba destinado a ser utilizado de esta manera.
Existen funciones especiales para imprimir números reales con la precisión requerida.
Dígame por qué es necesario redondear los números reales en el proceso de cálculo. Porque en este caso, ¡se pierde precisión de cálculo!
Estamos hablando de la correcta comparación de precios, paradas, lotes
Aquí se necesita cierta precisión.