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

 
TheXpert :

두 번째 숫자에 잘못된 이중 형식이 있다고 생각하지만 인쇄 및 작업 모두에서 여전히 유효성이 검사됩니다. 아마도 그것이 무너지는 이유일 것입니다.

유효한.

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

void OnStart ()
{
   double Num = 0 ;
  
  _W(Num) = ( uchar ) 1 ;
  
   for ( int i = 0 ; i < 324 ; i++)
    Num *= 10 ;
    
   Print (Num); // 4.940656458412466
}
 
fxsaber :

유효한.

위의 예에서 내가 Num!= Num을 어떻게 표시했는지 비교하십시오 - true이면 이 double은 유효하지 않지만 Print() 가 거기에 쓰는 내용은 ... 글쎄, 말하자면 7개의 봉인 뒤에 숨겨진 미스터리입니다.

 
Igor Makanu :

위의 예에서 내가 Num!= Num을 어떻게 표시했는지 비교하십시오 - true이면 이 double은 유효하지 않지만 Print()가 거기에 쓰는 내용은 ... 글쎄, 말하자면 7개의 봉인 뒤에 숨겨진 미스터리입니다.

물론 거짓. 이것은 정상적인 수치입니다. NaN은 주제에서 완전히 벗어났습니다.

 
fxsaber :


MathIsValidNumber 가 참이라고 말합니다.

 
TheXpert :

예 MathIsValidNumber가 참이라고 말합니다.

이것은 계산을 통해 이 숫자를 얻는 방법입니다.

 void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
    Num /= 10 ;
    
   Print ( 0.1 * Num == 0 ); // true
}
 
void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
   { Num /= 10 ;
    
   Print (Num, " : " , 0.1 * Num == 0 ); // true
  }
   Print (Num!=Num);
   Print ( DBL_MIN );
}

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-323 : 거짓

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-324 : 사실

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 거짓

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 2.225073858507201e-308

제 생각에는 배정밀도 한계를 벗어났습니다.

상향:

좋아요:

 void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
   { Num /= 10 ;
    
//  Print(Num, " : ", 0.1 * Num == 0); // true
   Print (Num, " : " ,Num - DBL_MIN > 0.0 );
  }
   Print (Num!=Num);
   Print ( DBL_MIN );
}
//_______________________________________________________________________
 
fxsaber :
이것은 내가 이해하지 못한 것입니다.


DBL_MIN은 최소 양수 double이 아닙니다.

DBL_MIN은 정규화된 숫자를 반환합니다 . 아래는 비정규화된 숫자입니다.

#include <limits>
#include <iostream>
using namespace std;

int main() {
        cout << numeric_limits< double >::min() << "  " << numeric_limits< double >::denorm_min() << endl;
}

2.22507e-308 4.94066e-324

 

일반적으로 DBL_MIN 보다 작은 본격적인 양수가 있다는 잘 알려진 진술을 찾았습니다.

 #define DBL_MIN_CORRECT ( 5 e- 324 ) // Минимальное положительное double-значение
 
fxsaber :
일반적으로 DBL_MIN 보다 작은 본격적인 양수가 있다는 잘 알려진 진술을 찾았습니다.

그래서 예 ... 그러나 0으로 나누는 문제는 여전히 열려 있습니까?

숫자 4.940656458412465e-324는 확실히 0이 아니지만 그러한 숫자로 나누는 것은 금지되어 있습니까?

 
Igor Makanu :

그래서 예 ... 그러나 0으로 나누는 문제는 여전히 열려 있습니까?

그것은 첫 번째 게시물부터 폐쇄되었습니다. 최소 숫자에 1보다 작은 값을 곱하면 결과는 0입니다.

사유: