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

 
Alexey Viktorov :

값이 없으면 반드시 0이고, 따라서 이것이 bool 유형 이 아닌 변수인 경우 false가 되기를 바랄 필요는 없습니다. bool에 대한 명시적 캐스트조차도 도움이되지 않습니다.

이것은 오류 없이 작동합니다.

솔직히 말해서, 나는 0이 어디에서 오는지 이해하지 못했습니다.

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

TickValue[0]에 쓰레기가 있습니다. 0일 수도 있고 아닐 수도 있습니다.

TickValue[0]의 가비지가 0이 아니면 Points = Profit / Lot * 0이 아닌 쓰레기 * _Point를 계산하고, 그렇지 않고 TickValue[0]의 쓰레기가 0이면 Points를 0으로 설정합니다.

그리고 Lot가 선언될 때 Lot가 1로 초기화된 경우 표현식 Lot * 0이 아닌 쓰레기 * _Point 에서 0은 어디에서 왔습니까? _Point에 0이 있습니까 ?

 
fxsaber :

오류는 분명합니다.

알겠습니다. 오류가 명확하지 않습니다. 그리고 나는 번식할 수 없다.

 
TheXpert :

알겠습니다. 오류가 명확하지 않습니다. 그리고 나는 번식할 수 없다.

대략적으로 말하면 이 함수를 호출하면 0으로 나눌 수 있습니다.

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


보고서 라이브러리에서 실제로 문제에 직면했습니다. 그때 나는 그것이 의미가 있다는 것을 깨달았습니다.

 
fxsaber :

대략적으로 말하면 이 함수를 호출하면 0으로 나눌 수 있습니다.

테두리에 그런 코드가 있는데 inf를 제공하지만 충돌하지 않습니다.

 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 :

테두리에 그런 코드가 있는데 inf를 제공하지만 충돌하지 않습니다.

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

void OnStart ()
{
   double Num = 0 ;
  
  _W(Num) = ( uchar ) 2 ;
  
   Print (WrongFunc(Num));
}
 
fxsaber :
그런 충돌.
 
TheXpert :
그런 충돌.

요약하자면, 0이 아닌 두 배를 곱하면 0이 될 수 있습니다. 그리고 이것은 퇴화한 사례가 아니라 실제로 실제 사례입니다.

대략적으로 말하자면, 전투 고문은 이 때문에 0이 아닌 확률로 부서질 수 있습니다.

 
또한 0을 확인하면 명시적이든 암시적이든(bool로 캐스팅) 저장되지 않습니다.
 
TheXpert :
또한 0을 확인하면 명시적이든 암시적이든(bool로 캐스팅) 저장되지 않습니다.
   return ( 0.1 * Num ? 1 / ( 0.1 * Num) : 0 );
 
fxsaber :

요약하자면, 0이 아닌 두 배를 곱하면 0이 될 수 있습니다. 그리고 이것은 퇴화한 사례가 아니라 실제로 실제 사례입니다.

대략적으로 말하자면, 전투 고문은 이 때문에 0이 아닌 확률로 부서질 수 있습니다.

NaN의 경우 추가로 확인해야 합니다. 이 코드가 작동 할 가능성이 큽니다.

f != f

또는 CompareDoubles() 예제에서와 같이 정밀도를 제한합니다. SB https://www.mql5.com/en/docs/basis/types/double 에 있는 것 같습니다.