Библиотеки: Math Utils

 

Math Utils:

Удобные функции для сравнения и округления чисел с плавающей запятой (в ценах, лотах, деньгах).

bool EQ(double a, double b, int digits = 8);

bool GT(double a, double b, int digits = 8);

bool LT(double a, double b, int digits = 8);

bool NE(double a, double b, int digits = 8);

bool GE(double a, double b, int digits = 8);

bool LE(double a, double b, int digits = 8);

Автор: amrali

 

Обновление 19 мая 2021 года

Добавлены функции для отладки

// Преобразование числового значения в точную десятичную текстовую строку.
string DoubleToStringExact(double value);

// Преобразование числового значения в шестнадцатеричную текстовую строку.
string DoubleToHexadecimal(double value);
 
Обновление 21 мая 2021 года

Добавлены различные функции

// Преобразуем x в диапазоне [min, max] в y в другом диапазоне [new_min, new_max]. 
// Это можно использовать для изменения масштаба значений индикаторов или графических объектов.
double map_range(double x, double min, double max, double new_min, double new_max);

// Получение количества цифр после десятичной точки.
int GetDigits(double number);
 

Обновление 27 мая 2021 года

Добавлены функции для отладки

// Возвращает разницу между двумя плавающими значениями, выраженную в эпсилон (ulps).
long UlpDiff(const double num1, const double num2);

// Возвращает следующее представляемое значение после x
double nextafter(double num);

Добавлены различные функции

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

bool IsRoundToStep(const double number, const double step);
Добавлены скрипт'dotnet_cross_check.mq5' и 'RoundSharp.dll', написанные на C#.

 
Обновление 30 мая 2021 года

Добавлены различные функции

//Получение количества целых цифр слева от десятичной точки.
int    IntegerDigits(double number);

// отобразите x в масштабе [min, max] на нормализованный масштаб [0, 1].
double normalize(double x, double min, double max);

Удобные функции для двоичного представления двоичных чисел

//Возвращает двойное значение, соответствующее битовому представлению.
double LongBitsToDouble(long bits);

//Возвращает битовое представление, соответствующее двойному значению.
long   DoubleToLongBits(double value);

//Возвращает несмещенную экспоненту, используемую в битовом представлении.
int    GetExponent(double value);

//Возвращает мантиссу, используемую в битовом представлении.
long   GetMantissa(double value);

//Возвращает размер ulp аргумента.
double Ulp(double value);

Удобные функции для строкового представления двоичных чисел

// Преобразование числового значения в кратчайшее строковое представление
// которые превращаются в одно и то же числовое значение.
string Repr(double value);
 

Обновление 1 июня 2021 года

Добавлены новые функции:

// Возвращает сырое кодирование экспоненты в битовом представлении.
int    RawExponent(double value);

// Возвращает сырое кодирование сигнификата в битовом представлении.
long   RawSignificand(double value);

// Возвращает несмещенную (скорректированную) экспоненту двойного значения.
int    Exponent(double value);

// Возвращает знаковое значение двойного значения.
double Significand(double value);

// Определите, является ли число точно представимым в double.
bool   IsExactDouble(double value);

// Форматирует число с разделителем тысяч.
string FormatNumber(const double number,const string separator=",");
 
Обновление 17 июня 2021 года

Добавлены новые функции:
// Определяет, является ли переданное значение целым числом.
bool   IsInteger(double num);

// Получение десятичной части (всегда положительной)
double GetFraction(double num);

// Обрезание (ограничение) числа по границам (диапазону)
template<typename T>
T      Clip(T value, T low, T high);

// В mql ошибка деления нуля заставляет программу mql остановиться.
double safeDiv(double x, double y);

// Преобразование числового значения в строку шестнадцатеричной константы float.
string DoubleToHexFloatConstant(double value);
 

Обновление 20 июня 2021 года

Добавлена новая функция:

// Продвигает число с плавающей точкой на указанное количество ULP.
double DoubleAdvance(double value, long distance);


 

Обновление 21 июня 2021 года

Добавлен новый макрос, похожий на функцию:

// Выведите двойные числа, используя спецификатор формата round-trip ("%.17g").
#define  PRINT_R(A) Print(#A + " = ", Repr(A))


 
Можно ли их добавить в mt4? Вы тестировали их в mt4? (я имею в виду включаемый файл)
 

Обновление 27 января 2023 года

Переименованы функции округления для большей согласованности:

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);

Добавлены две новые функции для сравнения двойных чисел:

//+------------------------------------------------------------------+
//| Проверьте почти равенство (игнорируйте крошечную ошибку rounoff)|
//| Если двоичные представления двух двоек отличаются более чем на |
//| один наименее значимый бит (ulp), функция возвращает false.|
//+------------------------------------------------------------------+
bool AlmostEqual(const double a, const double b);

//+------------------------------------------------------------------+
//| Проверьте, близки ли по значению два числа с плавающей точкой.|
//| Где, n: количество потерянных значащих цифр |
//| через ошибки округления (максимально допустимая разница в точности)|.
//| На практике обычно работает что-то вроде n = 2 или 3.|
//+------------------------------------------------------------------+
bool IsClose(const double a, const double b, const int maxDifferentSignificantDigits = 2);