Implementazioni alternative di funzioni/approcci standard - pagina 7

 
pavlick_:

Perché convertire il doppio in intero (in questo modo) è un codice di merda. Round with friends non è progettato per ottenere il tipo intero dal tipo fluttuante.

Beh, chi vi impedisce di cambiare il tipo di funzione in doppio.
E controlla il tuo discorso, per favore.
 
Nikolai Semko:
Beh, chi ti impedisce di cambiare il tipo di funzione in doppio.
E controlla il tuo discorso, per favore.

Senza offesa. Ci sono tutti i tipi di rint, lrint, llrint per la conversione in interi. Non sono apparsi solo per una ragione quando è molto più facile fare il lungo (doppio). Convertire i floating in integer è un errore concettuale.

 
pavlick_:

Senza offesa. Ci sono tutti i tipi di rint, lrint, llrint per convertire in interi. Sono stati inventati per una ragione, quando si può fare molto più facilmente del lungo (doppio). Convertire i floating in integer è un errore concettuale.

Oh, sei proprio fuori dal giro...
 
Nikolai Semko:
Oh, sei proprio fuori dal mondo...

OK, l'UB è nelle vostre mani.

 
fxsaber:
Interpretazione ambigua allora. Ha deciso di emettere il tempo di ciclo, non il tempo medio di una chiamata di funzione.

Il guadagno è tra 3 e 8 volte.

Forse il metodo di calcolo del tempo-funzione non è impeccabile, ma è abbastanza oggettivo. Ma se qualcuno suggerisce un metodo migliore, più imparziale, sarebbe bello.

L'ho cambiato in tipo doppio per una completa analogia.

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

Suggerisco agli sviluppatori di usare questo algoritmo in funzioni regolari.

File:
TestRound.mq5  7 kb
 
)). Questo può avere un posto solo nei mestieri personali con una conoscenza esatta della gamma di valori, ma non nella biblioteca std. Le funzioni integrate non sono scritte da sciocchi, non pensate di essere i più intelligenti. Ecco un amico che scrive anche comportamenti indefiniti e non specificati e poi si sorprende che non funziona così https://www.linux.org.ru/forum/development/14422428#comments. Tutti questi risparmi di diversi nanosecondi non saranno nemmeno visibili nell'algoritmo reale (non nel ciclo nudo).
 

Non capisco nemmeno perché le funzioni di arrotondamento dovrebbero restituire il doppio. Secondo me, questo è il punto dell'arrotondamento - è necessario definire come ottenere un intero da un valore fluttuante.

Quale "errore concettuale" di conversione non è chiaro neanche a me.

 
Georgiy Merts:

Non capisco nemmeno perché le funzioni di arrotondamento dovrebbero restituire il doppio. Secondo me, questo è il punto dell'arrotondamento - è necessario definire come ottenere un intero da un valore fluttuante.

Quale "errore concettuale" di conversione non è chiaro neanche a me.

Pensate a cosa si ottiene al di fuori di un intero.
 
fxsaber:

NormalizeDouble

Il risultato è 1123275 e 1666643 a favore di MyNormalizeDouble (Optimize=1). Senza ottimizzazione è quattro volte più veloce (in memoria).


Ho sempre voluto chiederti se c'è molto da programmare nel tuo stile di codice.

Se hai il compito di progettare e creare un meccanismo molto complesso da solo, vale la pena usare il tuo modo di scrivere codice? E dovete controllare il rendimento di ogni disco ad ogni passo.

Quanto tempo impiegherà uno sviluppatore per leggere/scrivere/verificare il codice, se affronti questo processo nel tuo stile e al tuo livello?

Scommetto che invecchierei senza scrivere la metà di quello che avevo in mente.


zy. Mi dispiace per gli offtop. Lo stile di programmazione è una questione personale. Ma a un certo punto, si comincia a capire che il codice dovrebbe essere il più leggibile possibile, proprio per motivi di produttività.

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

Ho sempre voluto chiederti - quanto puoi programmare nel tuo stile di codice?

Un esempio del mio stile?