Bibliotheken: Math Utils

 

Math Utils:

Einfache Funktionen zum Vergleichen und Runden von rationalen Zahlen (Preise, Lots, Geld).

Autor: amrali

 

Aktualisierung 19. Mai 2021

Funktionen zur Fehlersuche hinzugefügt

// Konvertierung eines numerischen Wertes in eine exakte dezimale Zeichenkette.
string DoubleToStringExact(double value);

// Konvertierung des numerischen Wertes in die rohe hexadezimale Textzeichenfolge.
string DoubleToHexadecimal(double value);
 
Aktualisierung 21. Mai 2021

Verschiedene Funktionen hinzugefügt

// Konvertiert x im Bereich [min, max] in y in einem anderen Bereich [new_min, new_max]. 
// Dies kann verwendet werden, um Indikatorwerte oder grafische Objekte zu skalieren.
double map_range(double x, double min, double max, double new_min, double new_max);

// Anzahl der Stellen nach dem Dezimalpunkt ermitteln.
int GetDigits(double number);
 

Aktualisierung 27. Mai 2021

Funktionen zur Fehlersuche hinzugefügt

// Rückgabe int diff zwischen zwei Floats, ausgedrückt in Epsilon (ulps).
long UlpDiff(const double num1, const double num2);

// Gibt den nächsten darstellbaren Wert nach x zurück
double nextafter(double num);

Verschiedene Funktionen hinzugefügt

bool IsRound(const double number, const int digits);

bool IsRoundToStep(const double number, const double step);
Skript'dotnet_cross_check.mq5' und die in C# geschriebene 'RoundSharp.dll' wurden hinzugefügt.

 
Aktualisierung 30. Mai 2021

Diverse Funktionen hinzugefügt

//Gibt die Anzahl der ganzzahligen Ziffern links vom Dezimalpunkt.
int    IntegerDigits(double number);

//Abbildung von x auf einer Skala [min, max] auf die normierte Skala [0, 1].
double normalize(double x, double min, double max);

Praktische Funktionen für die binäre Darstellung von Doubles

//Returnt den Double-Wert, der einer Bit-Darstellung entspricht.
double LongBitsToDouble(long bits);

//Retourniert die Bit-Darstellung, die einem Double-Wert entspricht.
long   DoubleToLongBits(double value);

//Retourniert den in der Bitdarstellung verwendeten unverzerrten Exponenten.
int    GetExponent(double value);

//Retourniert die in der Bitdarstellung verwendete Mantisse.
long   GetMantissa(double value);

//Returnt die Größe eines ulp des Arguments.
double Ulp(double value);

Praktische Funktionen für die String-Darstellung von Doubles

// Umwandlung eines numerischen Werts in die kürzeste String-Darstellung
// die in denselben numerischen Wert umgewandelt werden.
string Repr(double value);
 

Aktualisierung 1. Juni 2021

Neue Funktionen hinzugefügt:

// Gibt die Rohkodierung des Exponenten in der Bitdarstellung zurück.
int    RawExponent(double value);

// Gibt die Rohkodierung des Signifikanten in der Bitdarstellung zurück.
long   RawSignificand(double value);

// Gibt den unverzerrten (angepassten) Exponenten eines Double-Wertes zurück.
int    Exponent(double value);

// Gibt den Signifikanten eines Double-Wertes zurück.
double Significand(double value);

// Bestimmen Sie, ob die Zahl genau in Double darstellbar ist.
bool   IsExactDouble(double value);

// Formatiert Zahlen mit Tausendertrennzeichen.
string FormatNumber(const double number,const string separator=",");
 
Aktualisierung 17. Juni 2021

Neue Funktionen hinzugefügt:
// Ermittelt, ob der übergebene Wert eine Ganzzahl ist.
bool   IsInteger(double num);

// Dezimalteil ermitteln (immer positiv)
double GetFraction(double num);

// Abschneiden (Begrenzen) einer Zahl auf Grenzen (Bereich)
template<typename T>
T      Clip(T value, T low, T high);

// In mql zwingt ein Fehler bei der Nullteilung das mql-Programm zum Anhalten.
double safeDiv(double x, double y);

// Konvertierung des numerischen Werts in die Hex-Float-Konstante string.
string DoubleToHexFloatConstant(double value);
 

Aktualisierung 20. Juni 2021

Neue Funktion hinzugefügt:

// Erhöht eine Gleitkommazahl um eine bestimmte Anzahl von ULPs.
double DoubleAdvance(double value, long distance);


 

Aktualisierung 21. Juni 2021

Neues funktionsähnliches Makro hinzugefügt:

// Druckt Doppelwerte unter Verwendung der Formatangabe "%.17g" für die Rundung.
#define  PRINT_R(A) Print(#A + " = ", Repr(A))


 
können diese zu mt4 hinzugefügt werden? haben Sie diese in mt4 getestet? (ich meine die Include-Datei)
 

Aktualisierung 27. Januar 2023

Die Rundungsfunktionen wurden umbenannt, um konsistenter zu sein:

double MathRound(const double value, const int digits);

double MathRound(const double value, const double step);

double MathFloor(const double value, const int digits);

double MathFloor(const double value, const double step);

double MathCeil(const double value, const int digits);

double MathCeil(const double value, const double step);

double MathTrunc(const double value, const int digits);

double MathTrunc(const double value, const double step);

Zwei neue Funktionen für den Vergleich von Doubles hinzugefügt:

//+------------------------------------------------------------------+
//| Fast-Gleichheit prüfen (kleine Rundungsfehler ignorieren)
//| Wenn sich die binären Darstellungen zweier Doppelwerte um mehr als | unterscheiden
//| Ein niederwertiges Bit (ulp), die Funktion gibt false zurück.
//+------------------------------------------------------------------+
bool AlmostEqual(const double a, const double b);

//+------------------------------------------------------------------+
//| Prüfen, ob zwei Fließkommazahlen im Wert nahe beieinander liegen.
//| Wobei n: die Anzahl der verlorenen signifikanten Ziffern ist.
//| durch Rundungsfehler (maximal zulässige Genauigkeitsdifferenz).
//| In der Praxis funktioniert meist etwas wie n = 2 oder 3.
//+------------------------------------------------------------------+
bool IsClose(const double a, const double b, const int maxDifferentSignificantDigits = 2);