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

 
fxsaber #:

你拒绝理解。

如果我知道事情的来龙去脉,也许我会理解。但就目前的情况来看,这看起来是对的。

 
amrali #:

只要两个数额相等,其中任何一个都是有效的最小值。考虑一下 MathMin(1,1),函数返回的是第一个(1)还是第二个(1)并无区别。

因此,返回 0.0 与返回 -0.0并无不同

编辑:顺便说一下,两个突出显示的表达式并不完全相同。

同意 我的同事 amrali 的观点。我还想补充一点,有一个本地函数MathMin()。它也认为符号不同的零相等。据我所知,它的算法非常简单。我在我的 CustomMathMin() 函数中复制了它。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
   double positive_zero_val, negative_zero_val;
   positive_zero_val = 0.0;
   negative_zero_val = -0.0;
   // 1) -0.0 / 0.0
   double native_min_val, custom_min_val;
   native_min_val = ::MathMin(negative_zero_val, positive_zero_val);
   custom_min_val = CustomMathMin(negative_zero_val, positive_zero_val);
   ::Print("\nArguments: -0.0, 0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   // 2) 0.0 / -0.0
   native_min_val = ::MathMin(positive_zero_val, negative_zero_val);
   custom_min_val = CustomMathMin(positive_zero_val, negative_zero_val);
   ::Print("\nArguments: 0.0, -0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   }
//+------------------------------------------------------------------+
//| Custom MathMin                                                   |
//+------------------------------------------------------------------+
double CustomMathMin(double  value1, double  value2)
   {
   if(value1 < value2)
      return value1;
   return value2;
   }
//+------------------------------------------------------------------+


我们在日志中看到了它:

2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: -0.0, 0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) 
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: 0.0, -0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = -0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = -0.00


不难看出,从两个相等的数字中,该算法会将第二个数字的最小值作为...

Документация по MQL5: Математические функции / MathMin
Документация по MQL5: Математические функции / MathMin
  • www.mql5.com
MathMin - Математические функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

你拒绝理解。

   Print(-0.0<0.0);     // false
   Print(-0.0>0.0);     // false
   Print(-0.0<=0.0);    // true
   Print(-0.0>=0.0);    // true
   Print(-0.0==0.0);    // true

这没什么特别的。只是-0.0===0.0。

 
Nikolai Semko #:

没什么特别的。只是-0.0===0.0

我很清楚这个问题,所以我写了 MathMin 的两个变体,以说明编程语言中数学上相同的函数会产生不同的结果。

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}
 
fxsaber #:

我对这个问题的理解非常透彻,因此我编写了两个版本的 MathMin,以说明编程语言中数学上相同的函数会产生不同的结果。

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}


在数字 0.0 和 -0.0 中,并非所有 64 位都相同,这一点显而易见


但仍然是 0.0 == -0.0

Base Convert: IEEE 754 Floating Point
  • baseconvert.com
Online IEEE 754 floating point converter and analysis. Convert between decimal, binary and hexadecimal
 
Ihor Herasko #:

<和<=符号似乎不同.....

同意

 
Nikolai Semko # :


在数字 0.0 和 -0.0 中,并非所有 64 位都相同,这一点显而易见



它希望 MathMin() 是确定的。因此,当两个参数相同时,总是给出相同的结果。而不是根据第一个或第二个参数的不同而给出不同的结果。

fxsaber 说得没错,这是个问题。

 
Alain Verleyen #:

它希望 MathMin() 函数是确定的因此,当两个参数相同时,总是给出相同的结果。而不是根据参数是第一个还是第二个而得出不同的结果....

确实如此。当两个数字相等时,返回第二个数字。我在上面举了一个例子...

 
   Print(pow(0.0,0.0)); 	// 1.0
   Print(pow(-0.0,-0.0));       // 1.0
   Print(pow(-0.0,0.0));        // 1.0
   Print(pow(0.0,-0.0));        // 1.0
   Print(0.0*-0.0);             // -0.0
   Print(-0.0*-0.0);            // 0.0


这并没有错。

 
Alain Verleyen #:

它希望 MathMin() 函数是确定的。因此,当两个参数相同时,总是给出相同的结果。而不是根据第一个或第二个参数的不同而给出不同的结果。

fxsaber 说得没错,这是个问题。

你说对了。在大型代码中,你可能会遇到难以发现的获得不同结果的问题。这就是我在这个主题中通知社区的原因。