Pregunta a los maestros del MQL4. De nuevo sobre la doble comparación. - página 10

 
Simca:
SK. escribió (a):

Mi más sincero pésame a los desarrolladores, tener queexplicar lo mismo 1000 veces a cada nuevo usuario...



Esto ya es un ataque descarado...
Estoy de acuerdo. Aunque SK. es una autoridad en el foro, pero la "tecnología informática específica" también me hace sospechar.
Está escrito en los libros de texto sobre el almacenamiento de números reales en la memoria y no dice nada sobre las variables que cambian por sí mismas. Aunque lo he escuchado no sólo de SK en este foro.
Así que si has engañado a todos los nuevos usuarios 1000 veces, ahora deberías encontrarlos y disculparte por tus palabras.

Estoy de acuerdo con Simca. Al realizar operaciones aritméticas es posible que se produzcan errores, pero al almacenar, escribir o leer quedan excluidos.

Por eso pregunté por el algoritmo de la función NormalizeDouble(), ¿quizás también tiene operaciones aritméticas que provocan un error?
¿Qué te parece Simca?
 

DE ACUERDO. Lo dices con tanta seguridad que empiezo a dudar de lo que dices.

Hasta hace un tiempo trabajaba en un viejo PC con 256MB de RAM. Cuando se buscaban algunos programas, el sistema operativo descargaba parte de los datos en el disco y luego los cargaba de nuevo. Desde que modifiqué el código (especificando la normalización en el operador de comparación) el error dejó de aparecer. Pero empecé a dudar después de escuchar sus palabras: ¿y si realmente no me había dado cuenta del error?

Ahora no sé si disculparme o no. Si me equivoco, que me perdonen los 1000 usuarios.

(pero aun así es mejor realizar la normalización directamente al calcular la operación de comparación:)

 
gravity001:
En los libros de texto se habla de almacenar números reales en la memoria y no se dice nada de que las variables cambien por sí mismas. Sin embargo, no es sóloSK quien ha escuchado esto en este foro.
Nada por sí mismo se modifica durante el almacenamiento. Pero la forma de representar los números reales en la memoria del ordenador afecta a la precisión (profundidad de bits) de los valores almacenados. Al realizar operaciones aritméticas con números reales, el resultado suele ser "poco preciso" (desde el punto de vista humano), por lo que a veces es necesario normalizar el resultado de la operación. Definitivamente, es necesario normalizar el resultado de las operaciones en caso de comparación posterior a la igualdad (a menudo a >, <). También es necesario normalizar el resultado si se opera con valores con la capacidad de dígitos estrictamente establecida (por ejemplo, los precios). Los cálculos intermedios con números reales no suelen requerir normalización.
Pero, todo esto se refiere a los cálculos mientras que los valores almacenados en la memoria no cambiarán independientemente de si están normalizados o no.
gravedad001:
Por eso preguntaba el algoritmo de la función NormalizeDouble(), ¿quizás también tiene operaciones aritméticas que provocan un error?
¿Qué te parece Simca?
Bueno, sobre el algoritmo de la función NormalizeDouble habría que preguntar a los desarrolladores, y yo no soy uno de ellos. :) Además, no es objeto de disputa, porque la función NormalizeDouble en ambos fragmentos de código se utilizó de forma absolutamente idéntica. La única diferencia radicaba en la comparación directa de los resultados de las dos normalizaciones y en la escritura de estos resultados en variables y la posterior comparación de sus valores. Y me di cuenta de que como el tipo del valor devuelto por la función NormalizeDouble coincide con el tipo de la variable utilizada para el almacenamiento, no habría diferencia entre los fragmentos citados. Pero si la función NormalizeDouble devuelve un valor de mayor dimensión que la variable en la que se almacena, entonces la diferencia puede producirse y no podemos estar seguros de que sea idéntica. Pero según la AYUDA del MetaEditor el tipo de datos en ambos casos es doble, por lo que no debería haber ninguna diferencia, independientemente de cómo se implemente la función NormalizeDouble.
 
SK. писал (а):

(pero aun así es mejor realizar la normalización directamente al calcular la operación de comparación:)

Y con esto, aplicado a cada nuevo usuario, estoy absolutamente de acuerdo. Si no se tiene una idea clara de qué y cómo funciona, es más razonable ir por el camino más seguro y fiable. Pero eso no nos concierne a usted ni a mí. :)
Y por mi parte (para los que no entienden bien la esencia de la cuestión) también puedo recomendar:

(pero aun así, es mejor realizar la normalización directamente al calcular la operación de comparación (c) SK.

 
SK. писал (а):

(pero sigue siendo mejor hacer la normalización directamente al calcular el
se calcula la operación de comparación:)





Lo siento, pero en términos de eficiencia hay implementaciones mucho mejores para comparar datos que requieren normalización. Básicamente, este es el estándar (algoritmo de comparación). Hay que comparar la diferencia con la mitad de la dimensión de la escala. Lo que quiero decir: para comparar los precios (sean diferentes o no) hay que tomar la diferencia y compararla con 0,5*Roynt (se puede calcular sólo una vez durante la inicialización del EA/script/indicador. Esto es mucho más eficiente que llamar a una función, y más aún si también está en un bucle) .... Y no importará cómo se almacenen estos datos ni a qué signo insignificante se redondeen.

Buena suerte.
 
En primer lugar, trabajar con dubles es algo puramente de compilador, por lo que exigir comodidad a mql4, que es esencialmente un compilador intrínseco oculto, no es razonable. Lo principal, los desarrolladores han dado una forma de GARANTIZAR el resultado correcto de la comparación, lo hemos comprobado con nuestras manos, es, por supuesto, gráfico, pero ¡¡¡FUNCIONABLE!!! Aunque la documentación dice que normaliza sólo en caso de "!=" o "==", nuestras pruebas independientes y expertas han demostrado que (a>b) ¡NO GARANTIZA (!) un resultado correcto si a resulta ser igual a b! Incluso si se normaliza PREDVORABLEMENTE tanto a como b, el resultado es imprevisible. Y aquí hay una construcción de los desarrolladores:: NormalizarDoble(a-b, Dígitos)>0 ¡funciona con fiabilidad! No sé por qué a la gente de aquí no le gusta la función normalizar... Quizás (internamente) es bastante sempótica hecha así: dos dables se dividen por doble precisión, y se redondea hacia abajo (o hacia arriba). Después, los enteros se comparan sin problemas.
 
.FG писал (а):
En primer lugar, trabajar con dubles es algo puramente de compilador, por lo que exigir comodidad a mql4, que es esencialmente un compilador intrínseco oculto, no es razonable. Lo principal, los desarrolladores han dado una forma de GARANTIZAR el resultado correcto de la comparación, lo hemos comprobado con nuestras manos, es, por supuesto, gráfico, pero ¡¡¡FUNCIONA!!! Aunque la documentación dice que normaliza sólo en caso de "!=" o "==", nuestras pruebas independientes y expertas han demostrado que (a>b) ¡NO GARANTIZA (!) un resultado correcto si a resulta ser igual a b! Incluso si se normaliza PREDVORABLEMENTE tanto a como b, el resultado es imprevisible. Y aquí hay una construcción de los desarrolladores:: NormalizarDoble(a-b, Dígitos)>0 ¡funciona con fiabilidad! No sé por qué a la gente de aquí no le gusta la función normalizar... Quizás (internamente) es bastante sempótica hecha así: dos dables se dividen por doble precisión, y se redondea hacia abajo (o hacia arriba). Y después los enteros se comparan sin problemas.

Por favor, escriba en ruso correcto.

 
Dame un enlace al sitio del desarrollador (de la lengua rusa), y te prometo que voy a utilizar las definiciones del autor SOLO. :) En mi opinión, su idea no es más correcta que la mía, pero si usted personalmente quiere entender, voy a hacer un "portavoz de Rosh", si usted no puede distinguir entre el bla-bla y la valoración de los expertos. Porque escribí no usted, y el principiante 1001. :)
 
.FG писал (а):
Dame un enlace a tu sitio y te prometo que sólo utilizaré las DEFINICIONES DEL AUTOR. :) Tu idea, creo, no es más correcta que la mía, pero si TU PERSONALMENTE quieres entenderlo, haré de "portavoz de Rosh", si no puedes distinguir entre el bla-bla y la valoración de los expertos. Porque no te estaba escribiendo a ti, sino al 1001º recién llegado. :)

Por ejemplo, www.gramota.ru

No tenemos una sección albanesa en el foro. Sin embargo, después del próximo puesto no ruso se le enviará allí. Por favor, no hagas que parezca que estás usando el lenguaje.

 
En ese caso, tú, stringo, deberías ir a Cirilo y Metodio con un diploma de programación. Todos estos problemas de normalización los encontré en los compiladores libres de DOS, que hace tiempo que están implementados convenientemente en las versiones actuales. Por eso algunos programadores no entienden por qué necesitan una doble comprobación tan obsoleta. Cuando reescriban su código, atiborrándolo por todas partes de normolisis en comparación con el cero, se sorprenderán de encontrar la ausencia de errores en su propia "lógica C", y no el comentario RIGHT de los padres-ejecutivos, porque pueden aferrarse a la optimización y otras cosas secundarias. Pero las cuestiones relativas a los RESULTADOS de los cálculos básicos seguirán siendo cruciales y requerirán la máxima atención. Y si me amenazan con volver a mandarme a paseo, iremos a algún CME, cogeremos su documentación y escribiremos un programa con FIXes y otros trucos en OLBANIC. :) Y te quedarás sin trabajo. Harás tu mq6 y querrás que alguien al menos pruebe tus productos en albanés, pero no, no estaremos allí... Porque tú mismo nos prohibiste tranquilamente... :)))))))))))))))))))))))000
Razón de la queja: