Библиотеки: Math Utils - страница 4

 

fxsaber #:

Вам нужно научиться правильно проводить измерения производительности.

Вы делаете неправильные выводы.

К сожалению, вы не понимаете, что именно вы измеряете.

Так скажите мне, что я не понимаю, пожалуйста :-)

 
До сих пор я понимаю, что должен заменить код на вашу оптимизированную (!) функцию, а затем поместить большое предупреждение для пользователей, чтобы они отключили оптимизацию компилятора перед использованием библиотеки, чтобы получить ту же производительность, которую они получили бы без использования всего этого дерьма!
 
amrali #:
До сих пор я понимаю, что мне следует заменить код на вашу оптимизированную (!) функцию, а затем поместить большое предупреждение для пользователей, чтобы они отключили оптимизацию компилятора перед использованием библиотеки, чтобы получить ту же производительность, которую они получили бы без использования всего этого дерьма!

Если у вас действительно есть желание разобраться, как правильно измерять производительность каких-либо функций, зайдите на русскоязычный форум и спросите там. Разработчики рассказывали об этом подробно и с примерами. У меня ссылок нет.

 
Спасибо
 

Обновление 1 марта 2023 года

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

//+------------------------------------------------------------------+
//| Получите количество дробных цифр, согласующихся после десятичной дроби |
//| точка двух чисел. GetEqualDigits(3.124, 3.122) => 2 |
//+------------------------------------------------------------------+
int GetEqualDigits(const double a, const double b);

//+------------------------------------------------------------------+
//| Получите количество значащих цифр, с которыми согласуются два числа.|
//| Например, GetEqualSignificantDigits(3.124, 3.122) => 3 |
//+------------------------------------------------------------------+
int GetEqualSignificantDigits(const double a, const double b);

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

//+------------------------------------------------------------------+
//| Получение количества значащих цифр. Значимые цифры или цифры |
//| это сумма целых и десятичных цифр (слева и справа от |
//| десятичная точка), исключая ведущие и последующие нули.|
//| Например, число 1,23 имеет 2 знака после запятой и 3 с.ф.|
//| Подсказка: переведите число в научную систему счисления. Так легче понять. |
//+------------------------------------------------------------------+
int GetSignificantDigits(double value);

//+------------------------------------------------------------------+
//| Возвращает экспоненту научной нотации числа.|
//| В научной системе счисления число преобразуется в десятичную дробь |
//| от 1.0 до 10, умноженное на 10, возведенное в некоторую степень.|
//| Он вычисляет сдвиг десятичной точки, чтобы сохранить только один ненулевой знак |
//| цифра перед десятичной точкой.|
//+------------------------------------------------------------------+
int GetExponent10(const double value)l

//+------------------------------------------------------------------+
//| Вычисляет знак значения как 1, 0, -1 |
//+------------------------------------------------------------------+
double MathSign(const double value);

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

//+------------------------------------------------------------------+
//| Преобразование числового значения в строку в научной нотации |
//| с одной цифрой перед десятичной точкой (например, 6.22e-23)|.
//| Цифры: Необязательно. Количество цифр после десятичной точки. |
//| По умолчанию столько цифр, сколько необходимо для представления значения.|
//+------------------------------------------------------------------+
string DoubleToExponential(const double value, int digits = -1);


 
Обновление 8 марта 2023 года

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

//+------------------------------------------------------------------+
//| Возвращает pow(10, (int)power), использует быструю таблицу поиска мощностей.|
//| https://github.com/php/php-src/blob/master/ext/standard/math     |
//+------------------------------------------------------------------+
double GetPower10(const int power);

Функция работает гораздо быстрее, чем MathPow(10, power).

 
fxsaber #:

Быстрее.

@fxsaber Спасибо!

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

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

amrali, 2023.03.08 15:32

Обновление 8 марта 2023 года

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

//+------------------------------------------------------------------+
//| Возвращает pow(10, (int)power), использует быструю таблицу поиска мощностей.|
//+------------------------------------------------------------------+
double GetPower10(const int power);

Функция работает гораздо быстрее, чем MathPow(10, power).


 

Добавлены функции более быстрого округления.

//+------------------------------------------------------------------+
//| Быстрое вычисление ceil, floor и round с помощью арифметических операторов.|
//+------------------------------------------------------------------+
inline long Ceil (const double v);
inline long Floor(const double v);
inline long Round(const double v);
inline long Trunc(const double v);
Преимущество в скорости по сравнению со встроенными MathCeil, MathFloor и MathRound составляет около 160-240%.


 

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

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

//+------------------------------------------------------------------+
//| Оберните значение между min (включительно) и max (включительно)|.
//+------------------------------------------------------------------+
template<typename T>
T Wrap(const T value, const T min, const T max);

Переименованы функции округления в Ceil(), Floor(), Round() и Trunc(), чтобы избежать конфликтов имен с <Math\Stat\Math.mqh>.

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

 
Это три удобные функции для сравнения и округления чисел с плавающей точкой и форматирования денег:

1. `bool DoubleEquals(double x, double y, double eps)` сравнивает два двойных значения `x` и `y` с заданным значением эпсилон `eps` и возвращает булево значение, указывающее, равны ли они в пределах заданного допуска.

2. `double RoundTo(double value, int digits)` округляет двойное значение `value` до заданного количества десятичных `цифр`.

3. `string FormatMoney(double amount)` форматирует двойное значение `сумма` как строку, представляющую сумму в валюте. Он форматирует сумму с двумя десятичными знаками, заменяет десятичную точку запятой и вставляет пробелы через каждые три цифры для удобочитаемости. Также в конце добавляется символ валюты, полученный из `AccountInfoString(ACCOUNT_CURRENCY)`.

  1. DoubleEquals(double x, double y, double eps) - Эта функция сравнивает два двойных значения x и y с допуском eps. Она возвращает true, если x находится в пределах eps от y. Это полезно для сравнения чисел с плавающей точкой, которые могут быть не совсем равны из-за ошибок округления.

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

  1. RoundTo(double value, int digits) - Эта функция округляет двойное значение до заданного количества десятичных цифр. Для выполнения округления используется функция MathRound().

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

  1. FormatMoney(double amount) - Эта функция форматирует двойное значение суммы как строку с символами валюты, запятыми для разделения тысяч и двумя десятичными знаками. Она полезна для отображения денежных значений в удобном для пользователя виде.
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;
}

Сообщение отформатировано модератором