Implementaciones alternativas de funciones/enfoques estándar - página 7

 
pavlick_:

Porque convertir doble a entero (de esta manera) es una mierda de código. La ronda con los amigos no está diseñada para obtener el tipo entero del tipo flotante.

Bueno, quién te impide cambiar el tipo de función a doble.
Y controla tu discurso, por favor.
 
Nikolai Semko:
¿Quién te impide cambiar el tipo de función a doble?
Y controla tu discurso, por favor.

Sin ánimo de ofender. Hay todo tipo de rint, lrint, llrint para la conversión a enteros. No han aparecido porque sí, cuando es mucho más fácil hacer largos (dobles). La conversión de flotante a entero es un error conceptual.

 
pavlick_:

Sin ánimo de ofender. Hay todo tipo de rint, lrint, llrint para convertir a entero. Se inventaron por una razón, cuando se puede hacer mucho más fácil que el largo (doble). La conversión de flotante a entero es un error conceptual.

Oh, estás fuera de onda...
 
Nikolai Semko:
Oh, estás fuera de onda...

Bien, el LU está en tus manos.

 
fxsaber:
Interpretación ambigua entonces. Se ha decidido dar salida al tiempo de ciclo, no al tiempo medio de una llamada de función.

La ganancia es de entre 3 y 8 veces.

Tal vez el método de cálculo del tiempo de funcionamiento no sea impecable, pero es bastante objetivo. Pero si alguien sugiere un método mejor y más imparcial, sería una buena idea.

Lo cambié a tipo doble para la analogía completa.

double Ceil (double x) { return double((x-(long)x>0)?(long)x+1:(long)x);}
double Round(double x) { return double((x>0)?(long)(x+0.5):(long)(x-0.5));}
double Floor(double x) { return double((x>0)?(long)x:((long)x-x>0)?(long)x-1:(long)x);} 
2018.08.25 22:16:01.309 TestRound (EURUSD,M10)  Время цикла без округления = 1.315 наносекунд, сумма = 5249993749.98145962
2018.08.25 22:16:01.309 TestRound (EURUSD,M10)  Время выполнения функции sqrt = 0.628 наносекунд, сумма = 81969849.90928555  // даже квадратный корень вычисляется в несколько раз быстрее чем штатные функции округления
2018.08.25 22:16:01.313 TestRound (EURUSD,M10)  Время выполнения функции ceil =  2.037 наносекунд, Контрольная сумма = 5250492895.0
2018.08.25 22:16:01.315 TestRound (EURUSD,M10)  Время выполнения функции Ceil =  0.587 наносекунд, Контрольная сумма = 5250492895.0
2018.08.25 22:16:01.318 TestRound (EURUSD,M10)  Время выполнения функции floor = 2.247 наносекунд, Контрольная сумма = 5249492896.0
2018.08.25 22:16:01.320 TestRound (EURUSD,M10)  Время выполнения функции Floor = 0.385 наносекунд, Контрольная сумма = 5249492896.0
2018.08.25 22:16:01.323 TestRound (EURUSD,M10)  Время выполнения функции round = 1.610 наносекунд, Контрольная сумма = 5249992896.0
2018.08.25 22:16:01.324 TestRound (EURUSD,M10)  Время выполнения функции Round = 0.181 наносекунд, Контрольная сумма = 5249992896.0

Sugiero que los desarrolladores utilicen este algoritmo en funciones regulares.

Archivos adjuntos:
TestRound.mq5  7 kb
 
)). Esto puede tener un lugar sólo en la artesanía personal con el conocimiento exacto de la gama de valores, pero no en la biblioteca std. Las funciones incorporadas no están escritas por tontos, no te creas el más listo. Aquí hay un amigo que también escribe un comportamiento indefinido y no especificado y luego se sorprende de que no funcione así https://www.linux.org.ru/forum/development/14422428#comments. Todo este ahorro de varios nanosegundos ni siquiera será visible en el algoritmo real (no en el bucle desnudo).
 

Tampoco entiendo por qué las funciones de redondeo deben devolver el doble. En mi opinión, ese es el sentido del redondeo: hay que definir cómo obtener un número entero a partir de un valor flotante.

El "error conceptual" de la conversión tampoco lo tengo muy claro.

 
Georgiy Merts:

Tampoco entiendo por qué las funciones de redondeo deben devolver el doble. En mi opinión, ese es el sentido del redondeo: hay que definir cómo obtener un número entero a partir de un valor flotante.

El "error conceptual" de la conversión tampoco lo tengo muy claro.

Piensa en lo que obtienes fuera de un número entero.
 
fxsaber:

NormalizarDoble

El resultado es 1123275 y 1666643 a favor de MyNormalizeDouble (Optimize=1). Sin optimización es cuatro veces más rápido (en memoria).


Siempre quise preguntarte si hay mucho que puedas programar en tu estilo de código.

Si tienes la tarea de diseñar y crear un mecanismo muy complejo por ti mismo, ¿merece la pena utilizar tu forma de escribir código? Y debes comprobar el rendimiento de cada disco en cada paso.

¿Cuánto tiempo tardará un desarrollador en leer/escribir/verificar el código, si aborda este proceso con su estilo y a su nivel?

Apuesto a que envejecería sin escribir la mitad de lo que tenía en mente.


zy. Lo siento por lo de los offtops. El estilo de programación es una cuestión personal. Pero en un momento dado, empiezas a darte cuenta de que el código debe ser lo más legible posible, precisamente por motivos de productividad.

Productivity - США - MetaTrader 5
Productivity - США - MetaTrader 5
  • www.metatrader5.com
Индекс производительности труда показывает изменение объема выпущенной продукции, приходящегося на одного работника. Этот показатель полезен для предсказания инфляции и прироста объема производства. Если стоимость труда увеличивается соответственно увеличению производительности, и, кроме того, маловероятно увеличение производственных издержек...
 
Реter Konow:

Siempre he querido preguntarte: ¿cuánto puedes programar en tu estilo de código?

¿Un ejemplo de mi estilo?