실수 유형 (double, float)

실수 유형(또는 부동 소수점 유형)은 분수 부분이 있는 값을 나타냅니다. MQL5 언어에는 부동 소수점 번호에 대한 두 가지 유형이 있습니다.컴퓨터 메모리의 실수 표시 방법은 IEEE 754 표준에 의해 정의되며 플랫폼, 운영 체제 또는 프로그래밍 언어와 독립적입니다.

유형

크기 (바이트)

최소 양수 값

최소값

C++ 아날로그

float

4

1.175494351e-38

3.402823466e+38

float

double

8

2.2250738585072014e-308

1.7976931348623158e+308

double

 

double

double 실수형은 64비트(부호 1비트, 지수 11비트, 가수 52비트)를 차지합니다.

float

float 실수형은 32비트(부호 1비트, 지수 8비트, 가수 23비트)를 차지합니다.

벡터

더블 타입 숫자의 의 1차원 배열. 데이터 메모리는 동적으로 할당됩니다. 벡터 속성은 다음을 사용하여 얻을 수 있습니다.methods, 이때 벡터 크기는 변경할 수 있습니다. 벡터<double> 항목은 템플릿 함수에서 사용될 수 있습니다.

vectorf

1차원 배열 float 유형 숫자가 정밀도 손실이 문제 되지 않을 경우 벡터 대신에 사용될 수 있습니다. 벡터<float> 항목은 템플릿 함수에서 사용할 수 있습니다.

vectorc

복소수 유형의 수의 1차원 배열은 복소수를 처리하기 위한 것입니다. 벡터<complex> entry는 템플릿 함수에서 사용할 수 있습니다. vectorc 유형의 벡터 작업은 아직 구현되지 않았습니다.

행렬

행렬은 2차원 배열로 double 타입 숫자의 배열입니다. 행렬 요소의 메모리는 동적으로 분배됩니다. 행렬 속성은 다음을 사용하여 얻을 수 있습니다. method, 이때 행렬 모양은 변경될 수 있습니다. 매트릭스<double> entry는 템플릿 함수에서 사용할 수 있습니다.

matrixf

2차원 배열 float 유형 숫자가 정밀도 손실이 문제 되지 않을 경우 행렬 대신에 사용될 수 있습니다. 행렬<float> entry는 템플릿 함수에서 사용할 수 있습니다.

matrixc

복소수 유형의 수의 1차원 배열은 복소수를 처리하기 위한 것입니다. 매트릭스<complex> entry는 템플릿 함수에서 사용할 수 있습니다. matrixc 유형의 벡터 작업은 아직 구현되지 않았습니다.

 

double 명칭은 이 숫자들의 정확도가 float 유형의 숫자보다 정확도가 2배 높다는 것을 의미합니다. 대부분의 경우, double 타입이 가장 편리합니다. 대부분의 경우 제한된 정밀도인 float 숫자만으로는 충분하지 않습니다. float 유형이 여전히 사용되는 이유는 메모리를 저장하기 때문입니다(실수의 큰 배열에 중요함).

부동 소수점 상수는 정수 부분, 점(.) 및 분수 부분으로 구성됩니다. 정수 및 분수 부분은 소수 자릿수의 시퀀스입니다.

예제:

   double a=12.111;
   double b=-956.1007;
   float  c =0.0001;
   float  d =16;

실수 상수를 쓰는 과학적인 방법이 있는데, 종종 이러한 기록 방법은 전통적인 것보다 더 간결합니다.

예제:

   double c1=1.12123515e-25;
   double c2=0.000000000000000000000000112123515// 소수점 뒤의 24개의 0
   
   Print("1. c1 =",DoubleToString(c1,16));
   // 결과: 1. c1 = 0.0000000000000000
   
   Print("2. c1 =",DoubleToString(c1,-16));
   // 결과: 2. c1 = 1.1212351499999999e-025
 
   Print("3. c2 =",DoubleToString(c2,-16));
   // 결과: 3. c2 = 1.1212351499999999e-025

실수들은 2진수 체계에서 어느 정도 제한된 정확도로 메모리에 저장되지만, 일반적으로 소수 표기법이 사용된다는 점을 기억해야 합니다. 그렇기 때문에 십진법으로 정확하게 표현되는 많은 숫자들은 이진법에서 무한분수로만 쓸 수 있습니다.

예를 들어, 0.3과 0.7은 컴퓨터에서 무한 분수로 표시되는 반면 0.25는 두 개의 검정력을 나타내기 때문에 정확히 저장됩니다.

이와 관련하여, 동일성에 대해 두 실수 비교는 정확하지 않기 때문에 비교하지 않는 것이 강력히 권장됩니다.

예제:

void OnStart()
  {
//---
   double three=3.0;
   double x,y,z;
   x=1/three;
   y=4/three;
   z=5/three;
   if(x+y==z) 
      Print("1/3 + 4/3 == 5/3");
   else 
      Print("1/3 + 4/3 != 5/3");
// 결과: 1/3 + 4/3 != 5/3
  }

여전히 두 실수의 동일성을 비교해야 하는 경우 두 가지 다른 방법으로 이 작업을 수행할 수 있습니다. 첫 번째 방법은 두 숫자의 차이를 비교 정확도를 지정하는 소량으로 비교하는 것입니다.

예제:

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }
void OnStart()
  {
   double d_val=0.7;
   float  f_val=0.7;
   if(EqualDoubles(d_val,f_val,0.000000000000001)) 
      Print(d_val," equals ",f_val);
   else 
      Print("Different: d_val = ",DoubleToString(d_val,16),"  f_val = ",DoubleToString(f_val,16));
// 결과: Different: d_val= 0.7000000000000000   f_val= 0.6999999880790710
  }

위의 예에서 엡실론 값은 사전 정의된 상수 DBL_EPSILON보다 작을 수 없습니다. 이 상수의 값은 2.2204460492503131e-016 입니다. float dbguddp 해당하는 상수는 FLT_EPSILON = 1.192092896e-07 입니다. 이 값의 의미는 다음과 같습니다: 다음 조건을 만족하는 가장 낮은 값입니다 1.0 + DBL_EPSILON! = 1.0 (for numbers of float type 1.0 + FLT_EPSILON! = 1.0).

두 번째 방법은 두 실수 간의 정규화된 차이를 0과 비교하는 방법을 제공합니다. 정규화된 숫자를 사용하는 모든 수학 연산은 정규화되지 않은 결과를 제공하므로 정규화된 숫자의 차이를 0으로 비교하는 것은 의미가 없습니다.

예제:

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) 
      return(true);
   else 
      return(false);
  }
void OnStart()
  {
   double d_val=0.3;
   float  f_val=0.3;
   if(CompareDoubles(d_val,f_val)) 
      Print(d_val," equals ",f_val);
   else 
      Print("Different: d_val = ",DoubleToString(d_val,16),"  f_val = ",DoubleToString(f_val,16));
// 결과: Different: d_val= 0.3000000000000000   f_val= 0.3000000119209290
  }

수학적 보조 프로세서의 일부 연산은 잘못된 실수 수를 발생시킬 수 있으며, 이는 잘못된 실수 수를 가진 연산의 결과가 정의되지 않기 때문에 수학적 연산 및 비교 연산에 사용할 수 없습니다. 예를 들어, 2의 아크사인을 계산하려고 하면 음의 무한대가 됩니다.

예제:

   double abnormal = MathArcsin(2.0);
   Print("MathArcsin(2.0) =",abnormal);
// 결과:  MathArcsin(2.0) = -1.#IND

마이너스 무한대 외에 플러스 무한대와 NaN(숫자가 아님)이 있습니다. 이 숫자가 유효하지 않은지 확인하려면 MathIsValidNumber()를 사용하면 됩니다. IEEE 표준에 따르면, 그들은 특별한 기계 표현을 가지고 있습니다. 예를 들어, 이중 유형에 대한 더하기 무한대의 비트 표현은 0x7FF0 0000 0000 0000입니다.

예제:

struct str1
  {
   double d;
  };
struct str2
  {
   long l;
  };
 
//--- 시작
   str1 s1;
   str2 s2;
//---
   s1.d=MathArcsin(2.0);        // 유효하지 않은 숫자 가져오기 -1.#IND
   s2=s1;
   printf("1.  %f %I64X",s1.d,s2.l);
//---
   s2.l=0xFFFF000000000000;     // 유효하지 않은 숫자 -1.#QNAN
   s1=s2;
   printf("2.  %f %I64X",s1.d,s2.l);
//---
   s2.l=0x7FF7000000000000;     // 가장 큰 비-숫자 SNaN
   s1=s2;
   printf("3.   %f %I64X",s1.d,s2.l);
//---
   s2.l=0x7FF8000000000000;     // 가장 작은 비-숫자 QNaN
   s1=s2;
   printf("4.   %f %I64X",s1.d,s2.l);
//---
   s2.l=0x7FFF000000000000;     // 가장 큰 비-숫자 QNaN
   s1=s2;
   printf("5.   %f %I64X",s1.d,s2.l);
//---
   s2.l=0x7FF0000000000000;     // 양의 무한대 1.#INF 및 가장 작은 비-숫자 SNaN
   s1=s2;
   printf("6.   %f %I64X",s1.d,s2.l);
//---
   s2.l=0xFFF0000000000000;     // 음의 무한대 -1.#INF
   s1=s2;
   printf("7.  %f %I64X",s1.d,s2.l);
//---
   s2.l=0x8000000000000000;     // 음수 영 -0.0
   s1=s2;
   printf("8.  %f %I64X",s1.d,s2.l);
//---
   s2.l=0x3FE0000000000000;     // 0.5
   s1=s2;
   printf("9.   %f %I64X",s1.d,s2.l);
//---
   s2.l=0x3FF0000000000000;     // 1.0
   s1=s2;
   printf("10.  %f %I64X",s1.d,s2.l);
//---
   s2.l=0x7FEFFFFFFFFFFFFF;     // 최대 정규화 수 (MAX_DBL)
   s1=s2;
   printf("11.  %.16e %I64X",s1.d,s2.l);
//---
   s2.l=0x0010000000000000;     // 최소 양의 정규화 (MIN_DBL)
   s1=s2;
   printf("12.  %.16e %.16I64X",s1.d,s2.l);
//---
   s1.d=0.7;                    // 0.7의 수가 무한 분수임을 증명하라
   s2=s1;
   printf("13.  %.16e %.16I64X",s1.d,s2.l);
/*
1.  -1.#IND00 FFF8000000000000
2.  -1.#QNAN0 FFFF000000000000
3.   1.#SNAN0 7FF7000000000000
4.   1.#QNAN0 7FF8000000000000
5.   1.#QNAN0 7FFF000000000000
6.   1.#INF00 7FF0000000000000
7.  -1.#INF00 FFF0000000000000
8.  -0.000000 8000000000000000
9.   0.500000 3FE0000000000000
10.  1.000000 3FF0000000000000
11.  1.7976931348623157e+308 7FEFFFFFFFFFFFFF
12.  2.2250738585072014e-308 0010000000000000
13.  6.9999999999999996e-001 3FE6666666666666 
*/

더 보기

DoubleToString, NormalizeDouble, Numeric Type Constants