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

 

数学ユーティリティ:

浮動小数点数(価格、ロット、資金)の比較や丸めのための便利な関数です。

作者: amrali

 

2021年5月19日更新

デバッグ機能を追加

// 数値を正確な10進数のテキスト文字列に変換する。
string DoubleToStringExact(double value);

// 数値を生の16進数テキスト文字列に変換する。
string DoubleToHexadecimal(double value);
 
2021年5月21日更新

雑多な機能を追加

// 範囲 [min, max] の x を別の範囲 [new_min, new_max] の y に変換する。 
// これは、インジケータ値やグラフィック・オブジェクトのスケールを変更するために使用できます。
double map_range(double x, double min, double max, double new_min, double new_max);

// 小数点以下の桁数を取得する。
int GetDigits(double number);
 

2021年5月27日更新

デバッグ用関数を追加

// イプシロン(ulps)で表された2つの浮動小数点数の差分を int で返します。
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);
C#スクリプト「dotnet_cross_check.mq5」と「RoundSharp.dll」を追加。

 
2021年5月30日更新

雑多な関数を追加

// 小数点の左側の整数桁数を取得する。
int    IntegerDigits(double number);

//スケール[min, max]上のxを正規化スケール[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);
 

2021年6月1日更新

新機能を追加しました:

// 指数の生のエンコードをビット表現で返す。
int    RawExponent(double value);

// ビット表現におけるシグニフィカンドの生のエンコードを返す。
long   RawSignificand(double value);

// double 型の値の、バイアスされていない(調整された)指数を返します。
int    Exponent(double value);

// double 型の値のシグニフィガンドを返します。
double Significand(double value);

// 数がdoubleで正確に表現可能かどうかを判断する。
bool   IsExactDouble(double value);

// 数値を千単位で区切る。
string FormatNumber(const double number,const string separator=",");
 
2021年6月17日更新

新機能を追加しました:
// 渡された値が整数かどうかを判定します。
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);

// 数値を16進数の浮動小数点定数文字列に変換する。
string DoubleToHexFloatConstant(double value);
 

2021年6月20日更新

新機能を追加しました:

// 浮動小数点数を指定された ULP 数だけ進める。
double DoubleAdvance(double value, long distance);


 

2021年6月21日更新

関数のようなマクロを追加:

// ラウンドトリップ("%.17g")フォーマット指定子を使用して2倍を表示する。
#define  PRINT_R(A) Print(#A + " = ", Repr(A))


 
これらはmt4に追加できますか? mt4でこれらをテストしましたか?(インクルードファイルのことです)
 

2023年1月27日更新

丸め関数の名称を変更:

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

倍精度比較関数を2つ追加:

//+------------------------------------------------------------------+
//| ほぼ等しいかチェックする。
//| 2つのダブルスのバイナリ表現が||以上異なる場合
//| 最下位ビット(ulp)が1つでもあれば、この関数は偽を返します。
//+------------------------------------------------------------------+
bool AlmostEqual(const double a, const double b);

//+------------------------------------------------------------------+
//| 2つの浮動小数点数の値が近いかどうかをチェックする。
//| ここで、nは失われた有効桁数である。
//| 丸め誤差(最大許容精度差).
//| n = 2または3のようなものが、実際には通常機能する。
//+------------------------------------------------------------------+
bool IsClose(const double a, const double b, const int maxDifferentSignificantDigits = 2);