向MQL4大师们提问。还是关于双倍比较。

 
你好!
如你所知,不仅是计算的正确性,而且编写的代码的可靠性也取决于代码中的编程风格和整洁度。
我们不写玩具,所以写好的程序的 可靠性是最重要的要求。大多数计算都是以杜伯尔为单位进行的,在代码中的正确比较
程序代码中的两个实数,需要一定的方法和准确性。
我正试图找出 "正确的 "编程风格,因此提出这个问题。

对于一个表达式

双A。
双b。

如果(a==b)或如果(a!=b)
{......} {......}

开发者建议这样做
//+------------------------------------------------------------------+
//|两个实数的比较函数。
//+------------------------------------------------------------------+
bool CompareDouble(double Number1, double Number2)。
{
bool Compare = NormalizeDouble(Number1 - Number2, 8) == 0;
返回(比较)。
}
//+------------------------------------------------------------------+


这个代码正确吗?

双A。
双b。

如果(a>b) 如果(a<b)
{......}{......}


在一般情况下很可能不是。检查的正确方法是什么?
总的来说,哪种工作方式更适合使用杜伯尔?
提前感谢每个人的答复。
 

只要有可能,我更喜欢使用较大和较小的数字进行比较。

double a;
double b;
 
if(a>b)             if(a<b)
    {......}            {......}

这样,我就不必太担心双倍于某一数字的运行。

Vol = 156.00000002; 
NormVol = NormalizeDouble(Vol,2); 
156.00

如果有必要将这些数字放在一起

if(a==b)    или         if(a!=b)
    {......}                    {......}

然后我首先将两个数字转换为点后的一个数字

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......}
 
xeon:

我首先将两个数字转换为点后的相同数字

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......} 
而在指标中计算 时,你是否使用Normalize和类似的准备工作?
我正在翻阅大量的代码,我正在学习编程,在指标代码中很少发现这种情况。这就是问题所在--如何正确地做到这一点。
 
VBAG:
xeon

我首先将两个数字转换为点后的相同数字

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......} 
你在计算指标时是否使用Normalize和类似的准备工作?
我正在翻阅大量的代码,我正在学习编程,在指标代码中很少发现这种情况。这就是问题所在--如何正确地做到这一点。

我尽量避免使用NormalizeDouble 或"<"和">"符号,因为指标、脚本或专家顾问的双倍数可能有差异。
 
xeon ,
谢谢你的意见。
 
始终保持正常化,就永远不会有配音的问题!;)
在任何比较中,任何掺杂,并刻意选择准确。

//--- NormalizeDouble
double nd( double value, int precision )
{
    return( NormalizeDouble( value, precision ) );
}
 
//--- MathAbs
double abs( double value )
{
    return( MathAbs( value ) );
}
 
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd( abs( nd( value1, precision ) - nd( value2, precision ) ), precision ) < nd( MathPow( 0.1, precision ), precision ) );
}

注意平等 功能--如果稍微改变。
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd( abs( value1 - value2 ), precision ) < nd( MathPow( 0.1, precision ), precision ) );
}
(在比较之前去掉每个数字的归一化),会得到不同的结果。

例如,equal( 0.123456784, 0.123456776 )在第一种情况下会返回,但在第二种情况下会返回;)
 
komposter:
始终保持正常化,就永远不会有配音的问题!;)
但会有性能问题。将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。
 
Irtron:
将数字与双精度进行比较的问题很牵强,来自于对数学的基本无知。

让我解释一下。

很明显,这里面有一个概念的混淆。在intel架构中,有一种浮点数字类型用来表示固定精度的数字,特别是包括交易环境的所有数值,因为处理器有一个专门用于浮点运算的脱粒器。

事实上,固定精度的数字在机器表示方面与整数的差别很小。在这种情况下,小数位的存在是有条件的。这一特性被广泛用于硬件不支持浮点运算的架构中,如ARM,它通过在PDA和智能手机中的使用得到了推广。那里的浮动算术必须用相当重的代码来模拟,这使处理器升温,从而浪费了电池,更不用说程序的执行 速度了。所以只要不可能用整数,就会使用固定格式。 浮动精度在最极端的情况下使用。或者说,当然应该是这样。

没有什么能阻止对市场价值使用固定(即整数)的算术。

这并不适用于指标的计算值。在那里,直接的比较是很充分的。为什么要对它们进行任何精确的比较?
 
感谢komposter 和 Irtron ! 已经决定不再写了,坐下来发明自己,没有看到你的帖子。
请看我用自己狡猾的手写的:
//+------------------------------------------------------------------+
bool EqualDouble(double dN1, double dN2,int Digit)
{
double d1 =NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 == 0.0;
return(res);
}
//+
bool LessDouble(double dN1, double dN2,int Digit) // If dN1<dN2
{
double d1 = NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d2-d1 > 0.0;
return(res);
}
//+
bool MoreDouble(double dN1, double dN2,int Digit) // If dN1>dN2
{
double d1 = NormalizeDouble(dN2,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 > 0.0;
return(res);
}
//+------------------------------------------------------------------+
Покритикуйте, пожалуйста.
 
VBAG:
请看我用马虎的手涂鸦的内容。
你想比较的是什么价值?价格、手数或指标值?
 
Irtron:
VBAG
请看看我用马虎的手涂鸦的内容。
你想比较的是什么价值?价格、手数或指标值?
我在开头写道。"试图获得'正确'的编程风格。"
从本质上讲,分词中的内容没有区别--只有数字四舍五入的准确性会有所不同,这取决于变量的要求。