Bibliotheken: Math Utils - Seite 4

 

fxsaber #:

Sie müssen lernen, wie man richtige Leistungsmessungen durchführt.

Sie ziehen falsche Schlüsse.

Leider verstehen Sie nicht, was Sie da messen.

Sagen Sie mir also bitte, was ich nicht verstehe :-)

 
Bis jetzt verstehe ich, dass ich den Code mit Ihrer optimierten (!) Funktion ersetzen sollte, dann setzen Sie eine große Warnung für Benutzer zu deaktivieren Compiler-Optimierungen vor der Verwendung der Bibliothek, um die gleiche Leistung zu erhalten, die sie ohne die Verwendung von all dieser Scheiße bekommen würde!
 
amrali #:
Bis jetzt habe ich verstanden, dass ich den Code durch Ihre optimierte (!) Funktion ersetzen und dann eine große Warnung für die Benutzer einfügen sollte, die Compiler-Optimierungen zu deaktivieren, bevor sie die Bibliothek verwenden, um die gleiche Leistung zu erhalten, die sie ohne diesen ganzen Mist erhalten würden!

Wenn Sie tatsächlich herausfinden wollen, wie man die Leistung von Funktionen korrekt misst, gehen Sie ins russischsprachige Forum und fragen Sie dort. Die Entwickler haben darüber ausführlich mit Beispielen gesprochen. Ich habe keine Links.

 
Danke
 

Aktualisierung 1. März 2023

Funktionen zum Vergleich von Doubles hinzugefügt:

//+------------------------------------------------------------------+
//| Anzahl der übereinstimmenden Nachkommastellen ermitteln |
//| Punkt zweier Zahlen. GetEqualDigits(3.124, 3.122) => 2 |
//+------------------------------------------------------------------+
int GetEqualDigits(const double a, const double b);

//+------------------------------------------------------------------+
//| Ermittelt die Anzahl der signifikanten Ziffern, die zwischen zwei Zahlen übereinstimmen.
//| Zum Beispiel: GetEqualSignificantDigits(3.124, 3.122) => 3 |
//+------------------------------------------------------------------+
int GetEqualSignificantDigits(const double a, const double b);

Diverse Funktionen hinzugefügt:

//+------------------------------------------------------------------+
//| Anzahl der signifikanten Ziffern ermitteln. Signifikante Ziffern oder Zahlen |
//| ist die Summe der ganzzahligen und dezimalen Ziffern (links und rechts vom |
//| Dezimalpunkt), ohne führende und nachfolgende Nullen.
//| Die Zahl 1,23 hat zum Beispiel 2 Nachkommastellen und 3 Nachkommastellen.
//| Tipp: Ändern Sie die Zahl in wissenschaftliche Notation. Das ist einfacher zu sehen. |
//+------------------------------------------------------------------+
int GetSignificantDigits(double value);

//+------------------------------------------------------------------+
//| Gibt den Exponenten der wissenschaftlichen Schreibweise einer Zahl zurück.
//| In wissenschaftlicher Notation wird eine Zahl in eine Dezimalzahl umgewandelt.
//| zwischen 1,0 und 10, multipliziert mit einer Potenz von 10.
//| Es berechnet die Verschiebung des Dezimalpunktes, um nur einen Nicht-Nullpunkt zu behalten.
//| Stelle vor dem Dezimalkomma.|
//+------------------------------------------------------------------+
int GetExponent10(const double value)l

//+------------------------------------------------------------------+
//| Berechnet das Vorzeichen eines Wertes als 1, 0, -1 |
//+------------------------------------------------------------------+
double MathSign(const double value);

Funktion zur Formatierung von Doubles zu String hinzugefügt:

//+------------------------------------------------------------------+
//| Umwandlung eines numerischen Wertes in eine Zeichenkette in wissenschaftlicher Notation |
//| mit einer Stelle vor dem Dezimalpunkt (z.B. 6,22e-23).
//| Ziffern : Optional. Die Anzahl der Stellen nach dem Dezimalkomma. |
//| Standardmäßig so viele Ziffern wie nötig, um den Wert darzustellen.
//+------------------------------------------------------------------+
string DoubleToExponential(const double value, int digits = -1);


 
Aktualisierung 8. März 2023

Neue Funktion "Verschiedenes" hinzugefügt.

//+------------------------------------------------------------------+
//| Gibt pow(10, (int)power) zurück, verwendet schnelle Nachschlagetabelle für Potenzen.
//| https://github.com/php/php-src/blob/master/ext/standard/math     |
//+------------------------------------------------------------------+
double GetPower10(const int power);

Die Funktion hat eine viel schnellere Leistung als MathPow(10, power).

 
fxsaber #:

Schneller.

@fxsaber Danke!

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: Math Utils

amrali, 2023.03.08 15:32

Aktualisierung 8. März 2023

Neue Funktion miscellaneous hinzugefügt.

//+------------------------------------------------------------------+
//| Gibt pow(10, (int)power) zurück, verwendet schnelle Nachschlagetabelle für Potenzen.
//+------------------------------------------------------------------+
double GetPower10(const int power);

Die Funktion hat eine viel schnellere Leistung als MathPow(10, power).


 

Schnellere Rundungsfunktionen hinzugefügt.

//+------------------------------------------------------------------+
//| Schnelle Ceils, Floors und Rundungen mit arithmetischen Operatoren.
//+------------------------------------------------------------------+
inline long Ceil (const double v);
inline long Floor(const double v);
inline long Round(const double v);
inline long Trunc(const double v);
Der Geschwindigkeitsvorteil gegenüber den eingebauten MathCeil, MathFloor und MathRound beträgt etwa 160-240%.


 

Aktualisierung 24. April 2023

Neue Funktion hinzugefügt:

//+------------------------------------------------------------------+
//| Einen Wert zwischen min (einschließlich) und max (ausschließlich) einschließen.
//+------------------------------------------------------------------+
template<typename T>
T Wrap(const T value, const T min, const T max);

Umbenennung der Rundungsfunktionen in Ceil(), Floor(), Round() und Trunc(), um Namenskonflikte mit <Math\Stat\Math.mqh> zu vermeiden.

Die Funktion GetDigits() wurde korrigiert, um in seltenen Situationen eine Endlosschleife zu vermeiden.

 
Dies sind drei praktische Funktionen für den Vergleich und die Rundung von Fließkommazahlen und die Formatierung von Geld:

1. `bool DoubleEquals(double x, double y, double eps)` vergleicht zwei Double-Werte `x` und `y` mit einem gegebenen Epsilon-Wert `eps` und gibt einen boolschen Wert zurück, der angibt, ob sie innerhalb der gegebenen Toleranz gleich sind.

2. `double RoundTo(double value, int digits)` rundet einen double-Wert `value` auf die angegebene Anzahl von Dezimalstellen `digits`.

3. `string FormatMoney(double amount)` formatiert einen Double-Wert `amount` als String, der einen Währungsbetrag darstellt. Er formatiert den Betrag mit zwei Dezimalstellen, ersetzt den Dezimalpunkt durch ein Komma und fügt alle drei Stellen Leerzeichen ein, um die Lesbarkeit zu verbessern. Außerdem wird am Ende das Währungssymbol aus `AccountInfoString(ACCOUNT_CURRENCY)` eingefügt.

  1. DoubleEquals(double x, double y, double eps) - Diese Funktion vergleicht zwei Double-Werte x und y mit einer Toleranz eps . Sie gibt true zurück, wenn x innerhalb von eps von y liegt. Dies ist nützlich für den Vergleich von Fließkommazahlen, die aufgrund von Rundungsfehlern nicht exakt gleich sind.

bool DoubleEquals(double x, double y, double eps) { return fabs(x - y) < eps; } 

  1. RoundTo(double value, int digits) - Diese Funktion rundet einen double-Wert auf eine bestimmte Anzahl von Dezimalstellen. Sie verwendet die Funktion MathRound(), um die Rundung durchzuführen.

double RoundTo(double value, int digits) { double factor = pow(10, digits); return MathRound(value * factor) / factor; }

  1. FormatMoney(double amount) - Diese Funktion formatiert einen Double-Wert als String mit Währungssymbolen, Kommas als Tausendertrennzeichen und zwei Dezimalstellen. Sie ist nützlich, um Geldwerte benutzerfreundlich darzustellen.
string FormatMoney(double amount) {
    string currency = AccountInfoString(ACCOUNT_CURRENCY);
    string formatted = StringFormat("%.2f", amount);
    formatted = StringReplace(formatted, ".", ",");
    int len = StringLen(formatted);
    for (int i = len - 6; i > 0; i -= 3) {
       formatted = StringSubstr(formatted, 0, i) + " " + StringSubstr(formatted, i);
    }
    return formatted + " " + currency;
}

Beitrag formatiert von Moderator