mql5语言的特点、微妙之处以及技巧 - 页 143

 
Alexey Viktorov:

你只是不应该期望,如果没有值,就一定是0,如果不是bool类型的 变量,就相应地是false。即使明确转换为bool也无济于事。

它这样工作没有错误。

老实说,我完全不明白零点是怎么来的。

const double Points = TickValue[0] ? Profit / (Lots * TickValue[0] * _Point) : 0; // zero divide

TickValue[0]包含垃圾。它可能等于也可能不等于零。

如果TickValue[0]中的垃圾不等于零,那么我们计算Points = Profit / Lots * non-zero trash * _Point,否则,如果TickValue[0]中的垃圾等于零 - 我们将Points等同于零。

如果Lots在声明时被初始化为1,那么表达式Lots * non-zero rubbish * _Point 从哪里得到0? _Point中 是否有零

 
fxsaber:

这个错误在事实上是很明显的。

好了,错误不清楚了。而且对我来说,它也没有再现。

 
TheXpert:

好吧,这个错误让人无法理解。而且它不会在我身上繁殖。

粗略地说,调用这个函数可能会导致除以零

// Неправильно написанная функция.
double WrongFunc( const double Num )
{
  return(Num ? 1 / (0.1 * Num) : 0);
}


我在报告库的实践中遇到了这个问题。然后我意识到这是符合逻辑的。

 
fxsaber:

粗略地说,调用这个函数可以导致除以零

我在border dubles上有这样的代码,但它没有崩溃

double f( const double Num )
{
  return(Num ? 1 / (0.1 * Num) : 0);
}

void OnStart()
{
  Print(f(1 e-308));  // 2019.10.28 13:02:19.457	test (USDJPY,H1) inf
}
 
TheXpert:

我在border dubles上得到同样的代码,但它没有崩溃。

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart()
{
  double Num = 0;
  
  _W(Num) = (uchar)2;
  
  Print(WrongFunc(Num));
}
 
fxsaber:
这样的畏缩。
 
TheXpert:
这样的崩溃。

综上所述,将两个非零的双子星相乘可以得到零。而这不是什么退化的情况,而是实践中的真实情况。

粗略地说,一个战斗的EA可以因为这个原因而中断,概率远远低于零。

 
而检查零不会保存,无论是显性的还是隐性的(bool转换)。
 
TheXpert:
而检查零不会保存,无论是显式还是隐式(bool转换)。
  return(0.1 * Num ? 1 / (0.1 * Num) : 0);
 
fxsaber:

综上所述,将两个非零的双子星相乘可以得到零。而且这不是什么退化的情况,而是实际中的真实情况。

粗略地说,一个战斗的EA可以因为这个原因而中断,概率远远低于零。

关于NaN,你需要另外检查,很可能这段代码会工作http://qaru.site/questions/20557/checking-if-a-double-or-float-is-nan-in-c

f != f

或限制精度,如CompareDoubles()的例子--似乎是在SBhttps://www.mql5.com/ru/docs/basis/types/double