Alternative Implementierungen von Standardfunktionen/-ansätzen - Seite 7

 
pavlick_:

Weil die Umwandlung von Double in Integer (auf diese Weise) beschissener Code ist. Round with friends ist nicht dafür gedacht, Ganzzahlen aus Fließkommazahlen zu gewinnen.

Nun, wer hindert Sie daran, den Funktionstyp in Double zu ändern.
Und kontrollieren Sie bitte Ihre Sprache.
 
Nikolai Semko:
Nun, wer hindert Sie daran, den Funktionstyp in Double zu ändern.
Und kontrollieren Sie bitte Ihre Sprache.

Nicht böse gemeint. Es gibt alle Arten von rint, lrint, llrint für die Umwandlung in Integer. Sie sind nicht ohne Grund aufgetaucht, obwohl es viel einfacher ist, lang(doppelt) zu arbeiten. Die Umwandlung von Fließkommazahlen in Ganzzahlen ist ein konzeptioneller Fehler.

 
pavlick_:

Nicht böse gemeint. Es gibt alle Arten von rint, lrint, llrint zur Umwandlung in Ganzzahlen. Sie wurden nicht umsonst erfunden, denn man kann vieles einfacher machen als lang(doppelt). Die Umwandlung von Fließkommazahlen in Ganzzahlen ist ein konzeptioneller Fehler.

Oh, du bist einfach nicht auf dem Laufenden...
 
Nikolai Semko:
Oh, du bist einfach nicht auf dem Laufenden...

OK, die UB liegt in Ihren Händen.

 
fxsaber:
Eine zweideutige Auslegung also. Es wurde beschlossen, die Zykluszeit und nicht die durchschnittliche Zeit eines Funktionsaufrufs auszugeben.

Der Gewinn liegt zwischen dem 3- und 8-fachen.

Vielleicht ist die Methode zur Berechnung der Zeit bis zur Funktion nicht fehlerfrei, aber sie ist recht objektiv. Aber wenn jemand eine bessere, unvoreingenommenere Methode vorschlägt, wäre das schön.

Aus Gründen der Analogie habe ich es in "double" geändert.

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

Ich schlage vor, dass die Entwickler diesen Algorithmus in regulären Funktionen verwenden.

Dateien:
TestRound.mq5  7 kb
 
)). Dies mag nur in persönlichen Handwerksbetrieben mit genauer Kenntnis des Wertebereichs einen Platz haben, aber nicht in der Standardbibliothek. Die eingebauten Funktionen werden nicht von Dummköpfen geschrieben, halten Sie sich nicht für die Klügsten. Hier ist ein Freund, der auch undefiniertes und nicht spezifiziertes Verhalten schreibt und dann überrascht ist, dass es so nicht funktioniert https://www.linux.org.ru/forum/development/14422428#comments. All diese Einsparungen von mehreren Nanosekunden werden im realen Algorithmus (nicht in der nackten Schleife) nicht einmal sichtbar sein.
 

Ich verstehe auch nicht, warum Rundungsfunktionen das Doppelte zurückgeben sollten. Meiner Meinung nach ist das der Sinn des Rundens - man muss definieren, wie man aus einem Gleitkommawert eine Ganzzahl erhält.

Welcher "begriffliche Fehler" bei der Umrechnung vorliegt, ist mir auch nicht ganz klar.

 
Georgiy Merts:

Ich verstehe auch nicht, warum Rundungsfunktionen das Doppelte zurückgeben sollten. Meiner Meinung nach ist das der Sinn des Rundens - man muss definieren, wie man aus einem Gleitkommawert eine Ganzzahl erhält.

Welcher "begriffliche Fehler" bei der Umrechnung vorliegt, ist mir auch nicht ganz klar.

Überlegen Sie, was Sie außerhalb einer ganzen Zahl erhalten.
 
fxsaber:

NormalizeDouble

Das Ergebnis ist 1123275 und 1666643 zu Gunsten von MyNormalizeDouble (Optimize=1). Ohne Optimierung ist es viermal schneller (im Speicher).


Ich wollte Sie schon immer mal fragen , ob Sie viel in Ihrem Codestil programmieren können.

Wenn Sie die Aufgabe haben, einen sehr komplexen Mechanismus selbst zu entwerfen und zu erstellen, lohnt es sich dann, Ihre Art, Code zu schreiben, zu verwenden? Und Sie müssen die Leistung jedes Datensatzes bei jedem Schritt überprüfen.

Wie viel Zeit wird ein Entwickler für das Lesen/Schreiben/Überprüfen des Codes benötigen, wenn Sie diesen Prozess in Ihrem Stil und auf Ihrem Niveau angehen?

Ich wette, ich würde alt werden, ohne auch nur die Hälfte von dem zu schreiben, was mir vorschwebt.


zy. Tut mir leid wegen der Offtops. Der Programmierstil ist eine persönliche Angelegenheit. Aber ab einem gewissen Punkt wird einem klar, dass der Code gerade aus Produktivitätsgründen so lesbar wie möglich sein sollte.

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

Ich wollte Sie schon immer mal fragen: Wie viel können Sie in Ihrem Codestil programmieren?

Ein Beispiel für meinen Stil?