程序库: 数学工具

 

数学工具:

浮点数 (价格,手数和资金) 比较及四舍五入的便利函数。

作者: amrali

 

2021 年 5 月 19 日更新

添加了调试功能

// 将数值转换为精确的十进制文本字符串。
string DoubleToStringExact(double value);

// 将数值转换为原始十六进制文本字符串。
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)表示的两个浮点数之间的差值。
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);

二进制表示双倍值的便捷函数

//Returns the double value corresponding to a bit representation.
double LongBitsToDouble(long bits);

//Returns the bit representation corresponding to a double value .
long   DoubleToLongBits(double value);

//Returns the unbiased exponent used in the bit representation.
int    GetExponent(double value);

//Returns the mantissa used in the bit representation.
long   GetMantissa(double value);

//Returns the size of an ulp of the argument.
double Ulp(double value);

二进制字符串表示法的便捷函数

// 将数值转换成最短的字符串表示法
// 循环成相同的数值。
string Repr(double value);
 

2021 年 6 月 1 日更新

新增功能:

// 返回指数在比特表示中的原始编码。
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=",");
 
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);

// 将数值转换为十六进制浮点常量字符串。
string DoubleToHexFloatConstant(double value);
 

2021 年 6 月 20 日更新

添加了新功能:

// 将浮点数提前指定的 ULP 个数。
double DoubleAdvance(double value, long distance);


 

2021 年 6 月 21 日更新

添加了新的类函数宏:

// 使用往返("%.17g")格式指定符打印双倍数。
#define  PRINT_R(A) Print(#A + " = ", Repr(A))


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

添加了两个用于比较双倍值的新函数:

//+------------------------------------------------------------------+
//| 检查是否几乎相等(忽略微小的 Rounoff 错误) | //| 检查是否几乎相等(忽略微小的 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);