ライブラリ: 数学ユーティリティ - ページ 4

 

fxsaber #:

適切なパフォーマンス測定の方法を学ぶ必要がある。

あなたは間違った結論を出している。

残念ながら、あなたは自分が何を測定しているのか理解していない。

では、私が何を理解していないのか教えてください :-)

 
今までは、コードをあなたの最適化された(!)関数に置き換えて、ライブラリを使用する前にコンパイラの最適化を無効にするようにユーザーに大きな警告を出すべきだと理解していた!
 
amrali #:
今までは、コードをあなたの最適化された(!)関数に置き換えて、ライブラリを使用する前にコンパイラの最適化を無効にするようユーザーに大きな警告を出すことで、こんなクソみたいなものを使わなくても同じパフォーマンスを得られるようにするべきだと理解していた!

もし本当に、関数の性能を正しく測定する方法を知りたいのであれば、ロシア語のフォーラムに行って質問してください。開発者が例を挙げて詳しく話している。私はリンクを持っていない。

 
ありがとう
 

2023年3月1日更新

倍数の比較関数を追加

//+------------------------------------------------------------------+
//| 小数の後に一致する小数の桁数を取得する。
//| GetEqualDigits(3.124,3.122)=>2|2つの数字の点。
//+------------------------------------------------------------------+
int GetEqualDigits(const double a, const double b);

//+------------------------------------------------------------------+
//| 2つの数値の一致する有効桁数を取得する。
//| 例えば、GetEqualSignificantDigits(3.124, 3.122) => 3 |.
//+------------------------------------------------------------------+
int GetEqualSignificantDigits(const double a, const double b);

雑多な関数を追加:

//+------------------------------------------------------------------+
//| 有効桁数を取得する。有効数字
//| の左と右)の合計である。
//| 小数点以下はゼロを除く。
//| 例えば、1.23は小数点以下2桁、3桁の数字である。
//| ヒント:数字を科学的記数法に変えてください。その方が見やすい。|
//+------------------------------------------------------------------+
int GetSignificantDigits(double value);

//+------------------------------------------------------------------+
//| 科学的記数法の指数を返す。
//| 科学的表記法では、数値は10進数に変換される。
//| 1.0から10の間で、10の何乗かを掛ける。
//| ゼロでない小数点が1つだけ残るように計算する。
//| 小数点以下の桁数。|
//+------------------------------------------------------------------+
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);


 
2023年3月8日更新

新しい雑多な関数を追加。

//+------------------------------------------------------------------+
//| 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 ありがとう!

取引、自動取引システム、取引戦略のテストに関するフォーラム

ライブラリ数学ユーティリティ

amrali, 2023.03.08 15:32

2023年3月8日更新

新しい雑多な関数を追加しました。

//+------------------------------------------------------------------+
//| 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% の速度向上。


 

2023年4月24日更新

新しい関数を追加しました:

//+------------------------------------------------------------------+
//| 最小値(包含)と最大値(包含)の間の値をラップする。
//+------------------------------------------------------------------+
template<typename T>
T Wrap(const T value, const T min, const T max);

<MathStatMath.mqh>との名前の衝突を避けるため、丸め関数の名前をCeil()、Floor()、Round()Trunc() に変更した。

稀な状況での無限ループを回避するためにGetDigits() 関数を修正した。

 
これらは、浮動小数点数の比較や丸め、お金の書式設定に便利な3つの関数です:

1. `bool DoubleEquals(double x, double y, double eps)` 2つのダブル値 `x` と `y` を与えられたイプシロン値 `eps` で比較し、それらが与えられた許容範囲内で等しいかどうかを示すブール値を返す。

2. `double RoundTo(double value, int digits)` 二重の値 `value` を、与えられた小数 `digits` の数に丸める。

3.文字列 FormatMoney(double amount)` は、double 値 `amount` を通貨量を表す文字列としてフォーマットする。これは、小数点以下2桁で金額をフォーマットし、小数点をカンマに置き換え、読みやすくするために3桁ごとに空白を挿入する。また、最後に `AccountInfoString(ACCOUNT_CURRENCY)` から取得した通貨記号を追加する。

  1. DoubleEquals(double x, double y, double eps) - この関数は、2つのダブル値xとyを許容誤差epsで比較します。x が y の eps 以内であれば真を返します。これは、丸め誤差のために正確に等しくない浮動小数点数を比較するのに便利です。

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

  1. RoundTo(double value, int digits) - この関数は、double 値を指定した小数桁数に丸めます。MathRound() 関数を使用して丸めを行います。

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

  1. FormatMoney(double amount) - この関数は、double 値の金額を、通貨記号、桁区切りのカンマ、および小数点以下 2 桁を含む文字列として書式設定します。この関数は、金額をユーザーフレンドリーな方法で表示するのに便利です。
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;
}

モデレータによってフォーマットされた投稿