mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 241

 
fxsaber #:

이해하지 못합니다.

상황의 배경을 알았다면 이해했을지도 모르죠. 하지만 지금 상황에서는 맞는 것 같습니다.

 
amrali #:

두 금액이 같다면 둘 중 어느 것이든 유효한 최소값입니다. MathMin(1, 1)을 생각해 보면 함수가 첫 번째(1) 또는 두 번째(1)를 반환하는지 여부는 다르지 않습니다.

따라서 0.0을 반환하는 것은 -0.0과 다르지 않습니다.

편집: 참고로 강조 표시된 두 표현식은 동일하지 않습니다.

제 동료 amrali의 의견에 동의합니다. 또한 MathMin() 네이티브 함수가 있다는 점도 덧붙이고 싶습니다. 또한 부호가 다른 0이 같다고 생각합니다. 제가 아는 한 그 알고리즘은 매우 간단합니다. 저는 이를 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가 맞습니다. 이것이 문제입니다.

제 말이 맞습니다. 큰 코드에서 다른 결과를 얻는 어려운 문제가 발생할 수 있습니다. 그래서 이 스레드에서 커뮤니티에 알린 것입니다.