//+------------------------------------------------------------------+//| Returns the size of a unit in the last place (machine epsilon) |//| for a specified double value. This is the positive distance |//| between this double value and the representable value next |//| larger in magnitude. |//+------------------------------------------------------------------+double machine_eps(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
dbl.bits++;
return dbl.value - value;
}
void OnStart()
{
double epsilon = machine_eps(1.0);
Print(epsilon); // 2.220446049250313e-16
}
//+------------------------------------------------------------------+//| Advances a fp double value by a specified number of epsilons. |//+------------------------------------------------------------------+double DoubleAdvance(constdoublevalue, constlong distance)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
dbl.bits += distance;
return dbl.value;
}
void OnStart()
{
double myvalue = 1.0;
//doubel myvalue = 1024.0;// Print the first 10 representable numbers from the counterfor (int i = 0; i < 10; i++)
{
myvalue = DoubleAdvance(myvalue, 1); // Increment the integer representation by 1 bit
Print(myvalue);
}
}
解释DBL_EPSILON 的定义:
这种解释很糟糕,因为
另一种解释DBL_EPSILON 含义的方法:
DBL_EPSILON 只是[1,2]中连续双倍值之间的间隙大小。
https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/
https://en.wikipedia.org/wiki/Machine_epsilon
为了更好地理解DBL_EPSILON,可以考虑递增一个浮点 计数器:
如果计数器的初始值为 1.0,那么计数器的步长(epsilon)在小数点后第 16 位为 2.220446049250250313e-16 (DBL_EPSILON) ≈ 2。
/* 1.0000000000000002 1.0000000000000004 1.0000000000000007 1.0000000000000009 1.000000000000001 1.0000000000000013 1.0000000000000016 1.0000000000000018 1.000000000000002 1.0000000000000022 */
如果计数器的初始值为 1024,则计数器 小数点后第 13 位的步长(epsilon )为 2.2737363675443232321e-13 (1024 * DBL_EPSILON) ≈ 2。
/* 1024.0000000000002 1024.0000000000005 1024.0000000000007 1024.000000000001 1024.0000000000011 1024.0000000000014 1024.0000000000016 1024.0000000000018 1024.000000000002 1024.0000000000023 */
如果计数器的初始值是 4503599627370496 (2^52),那么计数器的步长将是 1.0 (2^52 * DBL_EPSILON)= 1。 在这个范围内,双倍计数器的行为与整数计数器类似,不能表示分数。
/* 4503599627370497.0 4503599627370498.0 4503599627370499.0 4503599627370500.0 4503599627370501.0 4503599627370502.0 4503599627370503.0 4503599627370504.0 4503599627370505.0 4503599627370506.0 */
我们可以看到,较小的数字之间的间隙较小,而较大的数字之间的间隙较大。
因此,DBL_EPSILON 就是相对误差率。相对是指相对于数字的大小。
在 1.0 时,绝对误差 = 1 * 2.2204460492503131e-016 (DBL_EPSILON)。
d 时,绝对误差 ≈ d * DBL_EPSILON。
(DBL_EPSILON 是 1.0 时的参考利率,类似于银行的年利率,等于 2^-52)。
附带说明:如果您尝试打印 1024.0000000000003,它将打印 1024.0000000000002(四舍五入到最接近的可表示数),因为 1024.0000000000003 不是一个可表示数(不存在 fp 数)。
这就是所谓的表示错误:
上一个/下一个可表示数是通过位操作(如前面的枚举:DoubleAdvance(value, -1))或使用 DBL_EPSILON 得到的:
DBL_EPSILON主要 用于估计(或纠正)对二进制数进行数学运算后的 fp 舍入误差(数值分析):
|true result - fp result| / true result <= DBL_EPSILON
在 MT5 测试器中,如果使用的是遗传优化算法 而不是自定义 优化标准,是否会禁用 OnTester() 调用?
我认为不会。但我希望...最好不要进行配置解析。
PS.CARAUL!一切都没了!每次优化(应该/不应该)都会调用 OnTester(),这会大大增加优化的总时间!
谁能帮帮我...... )))))
在搜索过程中,我发现了一个有趣的未记录功能
可以隐藏对话框的输入注释
原帖在此
https://www.mql5.com/ru/forum/1271#comment_9019
在搜索过程中,我发现了一个有趣的未记录功能
您可以隐藏对话框的输入注释
原帖在此
https://www.mql5.com/ru/forum/1271#comment_9019
在 Tester 中,历史记录表仅在两种情况下被覆盖。