MQL4 마스터에 대한 질문입니다. 다시 Double Compare에 대해.

 
안녕하세요!
아시다시피 계산의 정확성뿐만 아니라 작성된 코드의 신뢰성도 프로그래밍 스타일과 코드의 정확성에 따라 달라집니다.
우리는 장난감을 쓰는 것이 아니므 로 작성된 프로그램 의 신뢰성이 첫 번째 요구 사항입니다. 대부분의 계산은 복식으로 이루어지며 정확한 비교는 코드에 있습니다.
두 개의 실수로 구성된 프로그램에는 특정 접근 방식과 정확성이 필요합니다.
"올바른" 프로그래밍 스타일을 찾으려고 합니다. 따라서 질문:

표현을 위해

이중;
더블 b;

if(a==b) 또는 if(a!=b)
{.......} {.......}

개발자 추천
//+----------------------------------------------- --------------------+
//| 두 실수를 비교하는 함수. |
//+----------------------------------------------- --------------------+
bool CompareDouble(이중 숫자1, 이중 숫자2)
{
bool 비교 = NormalizeDouble(숫자1 - 숫자2, 8) == 0;
반환(비교);
}
//+----------------------------------------------- --------------------+


코드가 맞습니까?

이중;
더블 b;

if(a>b) if(a<b)
{.......} {.......}


일반적인 경우에는 그렇지 않을 가능성이 큽니다. 어떤 올바른 검증 방법을 선택해야 합니까?
복식으로 작업하는 가장 좋은 스타일은 무엇입니까?
답변해 주시는 모든 분들께 미리 감사드립니다.
 

가능하면 비교를 위해 보다 큼 및 보다 작음 기호를 사용하는 것을 선호합니다.

 double a ;
double b ;
 
if ( a > b )             if ( a < b )
    { ...... }            { ...... }

특정 비트 깊이까지 두 배의 생성을 특별히 귀찮게 하지 않기 위해

 Vol = 156.00000002 ; 
NormVol = NormalizeDouble ( Vol ,2 ) ; 
156.00

모두 같으면 숫자를 넣어야합니다

 if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }

그런 다음 먼저 두 숫자를 점 뒤의 단일 비트로 가져옵니다.

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }
 
xeon :

그런 다음 먼저 두 숫자를 점 뒤의 단일 비트로 가져옵니다.

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }  
그리고 지표에서 계산할 때 Normalize 및 유사한 준비를 사용합니까?
나는 많은 코드를 보고 프로그래밍을 배우는데 인디케이터 코드에서는 거의 발생하지 않습니다. 여기에서 질문도 제기되었습니다. 좋은 것과 마찬가지로 필요합니다.
 
VBAG :
제온 :

그런 다음 먼저 두 숫자를 점 뒤의 단일 비트로 가져옵니다.

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }  
그리고 지표에서 계산할 때 Normalize 및 유사한 준비를 사용합니까?
나는 많은 코드를 보고 프로그래밍을 배우는데 인디케이터 코드에서는 거의 발생하지 않습니다. 여기에서 질문도 제기되었습니다. 좋은 것과 마찬가지로 필요합니다.

표시기, 스크립트 또는 전문가에 관계없이 모든 곳에서 이중 불일치가 발생할 수 있으므로 NormalizeDouble 을 사용하거나 "<" 및 ">" 기호를 사용하여 이를 방지하려고 합니다.
 
xeon ,
의견 주셔서 감사합니다.
 
항상 정규화하고 복식에 문제가 없을 것입니다! ;)
모든 비교, 모든 이중 및 의식적으로 선택된 정확도로.

 //--- NormalizeDouble
double nd ( double value , int precision )
{
    return ( NormalizeDouble ( value , precision ) ) ;
}
 
//--- MathAbs
double abs ( double value )
{
    return ( MathAbs ( value ) ) ;
}
 
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd ( abs ( nd ( value1 , precision ) - nd ( value2 , precision ) ) , precision ) < nd ( MathPow ( 0.1 , precision ) , precision ) ) ;
}

동등한 기능에주의하십시오 - 조금만 변경하면 :
 bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd ( abs ( value1 - value2 ) , precision ) < nd ( MathPow ( 0.1 , precision ) , precision ) ) ;
}
(비교하기 전에 각 숫자의 정규화를 제거), 다른 결과를 줄 것입니다.

예를 들어, equal( 0.1234567 84 , 0.1234567 76 )은 첫 번째 경우에 true 를 반환하고 두 번째 경우에 false 를 반환합니다 ;)
 
komposter :
항상 정규화하고 복식에 문제가 없을 것입니다! ;)
그러나 성능 문제가 있을 것입니다. 배정밀도를 사용하여 숫자를 비교하는 문제는 상당히 이해하기 어려운 문제이며 재료에 대한 기본적인 무지에서 비롯됩니다.
 
Irtron :
배정밀도를 사용하여 숫자를 비교하는 문제는 상당히 이해하기 어려운 문제이며 재료에 대한 기본적인 무지에서 비롯됩니다.

설명하겠습니다.

분명히 개념의 혼란이 있습니다. 프로세서에는 부동 산술을 위한 특수 탈곡기가 있기 때문에 특히 거래 환경의 모든 값을 포함하는 고정 정밀도 숫자를 나타내기 위해 인텔 아키텍처에서 사용되는 부동 정밀도 숫자 유형이 있습니다.

사실, 고정 정밀도 숫자는 기계 표현 측면에서 정수와 거의 차이가 없습니다. 이 경우 소수점 기호의 존재는 조건부입니다. 이 속성은 PDA 및 스마트폰에서 사용되어 인기를 얻은 ARM과 같은 하드웨어에서 부동 소수점 연산이 지원되지 않는 아키텍처에서 널리 사용됩니다. 부동 산술 은 프로그램 실행 속도는 말할 것도 없고 프로세서를 냉각시키고 그에 따라 배터리를 소모시키는 다소 무거운 코드로 에뮬레이트되어야 합니다. 따라서 정수를 생략할 수 없는 경우에는 고정 형식이 사용됩니다. 부동 정밀도는 가장 극단적인 경우에 사용됩니다. 오히려, 당연히 적용되어야 합니다.

시장 가치에 대해 고정(즉, 정수) 산술을 사용하는 것을 방해하는 것은 없습니다.

계산된 지표 값에는 적용되지 않습니다. 충분히 직접적인 비교가 있습니다. 왜 그것들을 어떤 정밀도와 비교합니까?
 
komposter와 Irtron 에게 감사드립니다! 나는 이미 그들이 다른 것을 쓰지 않기로 결정하고 직접 발명하기 위해 앉아서 귀하의 게시물을 보지 않았습니다.
부디, 서투른 손으로 무엇을 뿌렸는지:
//+----------------------------------------------- --------------------+
bool EqualDouble(이중 dN1, 이중 dN2, 정수 숫자)
{
이중 d1 = NormalizeDouble (dN1, 숫자);
이중 d2 = NormalizeDouble(dN2, 숫자);
부울 res=거짓;
해상도=d1-d2 == 0.0;
반환(res);
}
//+----------------------------------------------- --------------------+
bool LessDouble(double dN1, double dN2,int Digit) // dN1<dN2인 경우
{
이중 d1 = NormalizeDouble(dN1, 숫자);
이중 d2 = NormalizeDouble(dN2, 숫자);
부울 res=거짓;
res=d2-d1 > 0.0;
반환(res);
}
//+----------------------------------------------- --------------------+
bool MoreDouble(double dN1, double dN2,int Digit) // dN1>dN2인 경우
{
이중 d1 = NormalizeDouble(dN2, 숫자);
이중 d2 = NormalizeDouble(dN2, 숫자);
부울 res=거짓;
res=d1-d2 > 0.0;
반환(res);
}
//+----------------------------------------------- --------------------+
비판해주세요.
 
VBAG :
부디, 서투른 손으로 무엇을 뿌렸는지:
어떤 가치를 비교하려고 합니까? 가격, 로트 또는 지표 값?
 
Irtron :
VBAG :
부디, 서투른 손으로 무엇을 뿌렸는지:
어떤 가치를 비교하려고 합니까? 가격, 로트 또는 지표 값?
나는 처음에 이렇게 썼습니다. "나는 "올바른" 프로그래밍 스타일을 개발하려고 노력하고 있습니다."
그러나 실제로 복식에 있는 차이점은 무엇입니까? 변수에 대한 요구 사항에 따라 자릿수 반올림의 정확도만 다릅니다.