MQL4 마스터에 대한 질문입니다. 다시 Double Compare에 대해. - 페이지 5

 

놀라운 결론! 숫자가 무엇인지 "전혀 이해하지 못한" 경우에도 숫자에 대해 어떻게 생각합니까?

 
Integer :

놀라운 결론! 숫자가 무엇인지 "전혀 이해하지 못한" 경우에도 숫자에 대해 어떻게 생각합니까?

단어를 고르기 시작했습니까? 다음은 분명히 성격의 해명일 것입니다. :)
나는 본질적으로 말할 것이 없다면 왜 전혀 이야기하지 않기 때문에 그러한 설명에 참여하지 않는 것을 선호한다고 즉시 말할 것입니다.
 
VBAG :
교육 프로그램의 모든 전문가에게 깊은 감사를 전하고 싶습니다!

Irtron, 나는 나 자신을 위해 당신의 버전을 선택했습니다. 글쎄, 나는 그것을 정말로 좋아했습니다. 일반적인 경우에 대해 약간 조정, 확인 - 시계처럼 작동합니다.

int ComparePrice(더블 a, 더블 b, 두 자릿수)
{
a -= b;
b = 숫자;
만약 (a > b)
반환(1);
만약 (a < -b)
리턴(-1);
반환(0);
}
고맙습니다.
사전 선언된 값을 직접 전송하고 싶다는 것을 숫자로 설명하는 것을 잊었습니다.
두 자릿수14=0.00000000000001;
두 자릿수12=0.000000000001;
두 자릿수8=0.00000001;
두 자릿수4=0.0001;
두 자릿수2=0.01;
필요한 정확도를 결정합니다.
이러한 기능의 경우 매우 빠르게 작동합니다.
Irtron, 다시 한 번 감사합니다.

 
Irtron :
정수 :

놀라운 결론! 숫자가 무엇인지 "전혀 이해하지 못한" 경우에도 숫자에 대해 어떻게 생각합니까?

단어를 고르기 시작했습니까? 다음은 분명히 성격의 해명일 것입니다. :)
나는 본질적으로 말할 것이 없다면 왜 전혀 이야기하지 않기 때문에 그러한 설명에 참여하지 않는 것을 선호한다고 즉시 말할 것입니다.


왜 nitpick, 나는 당신이 쓴 것을 읽었습니다. 당신의 이해는 분명히 "당신의 솔직한 ... (자신의 말을 넣어)"에 의해 방해받습니다.

VBAG, ComparePrice()보다 빠르게 두 숫자를 비교하는 NormalizeDouble () 함수가 있는데 왜 바퀴를 재발명합니까?

 
Integer :

VBAG, ComparePrice()보다 빠르게 두 숫자를 비교하는 NormalizeDouble () 함수가 있는데 왜 바퀴를 재발명합니까?

이 함수는 두 개의 double을 비교하고 <, > 또는 =를 소수점 이하 14자리까지 반환합니다.(NormalizeDouble()은 소수점 이하 8자리로 제한됨)
비슷한 자전거나 더 나은 대안 솔루션을 제안해 주시면 기꺼이 사용하겠습니다.
감사합니다,
블라디미르
 
VBAG :
정수 :

VBAG, ComparePrice()보다 빠르게 두 숫자를 비교하는 NormalizeDouble () 함수가 있는데 왜 바퀴를 재발명합니까?

이 함수는 두 개의 double을 비교하고 <, > 또는 =를 소수점 이하 14자리까지 반환합니다.(NormalizeDouble()은 소수점 이하 8자리로 제한됨)
비슷한 자전거나 더 나은 대안 솔루션을 제안해 주시면 기꺼이 사용하겠습니다.
감사합니다,
블라디미르
다음은 재미를 위한 테스트입니다.
 int start ()
  {
//----
    double a = 1.23450001 , b = 1.23449999 ;
 
    int start1 = GetTickCount () , c1 ;
    for ( c1 = 0 ; c1 < 100000000 ; c1 ++ ) CD ( a , b , 0.00000001 ) ;
    int end1 = GetTickCount () ;
    
 
    int start2 = GetTickCount () , c2 ;
    for ( c2 = 0 ; c2 < 100000000 ; c2 ++ )   xNormalize ( a , b , 8 ) ;
    int end2 = GetTickCount () ;
 
    Print ( " CD: " , ( end1 - start1 ) , " , xNormalize: " , ( end2 - start2 ) ) ;
 
    return ( 0 ) ;
   }
 
//+ CompareDouble ---------------------------------------------------+ CompareDouble
int CD ( double a , double b , double digit )
{
    a -= b ;
    b = digit ;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
 
// Две операции NormalizeDouble----
bool xNormalize ( double a , double b , int digit )
  {
   double d1 = NormalizeDouble ( a , digit ) ;
   double d2 = NormalizeDouble ( b , digit ) ;
   
//   bool bCompare=d2-d1 > 0.0;
   bool bCompare = 0 ;
   return ( bCompare ) ;
2007.09.12 07:15:09 $CheckCompareDouble USDJPY,M5: CD: 20485, xNormalize: 51265

결론:
CD 함수는 두 개의 double을 비교하고 소수점 이하 14자리로 <, > 또는 =에 대한 답을 제공하며 단순한 NormalizeDouble() 실행보다 2배 빠릅니다(비교 논리 없이도).
 
예, NormalizeDouble ()에 대한 두 번의 호출은 CD보다 오래 걸리고 한 번의 호출은 더 빠릅니다. 정확도 14자 - 매혹적인 :-)
 
최근에는 저도 실수 비교를 해보았습니다!

많은 사람들이 비교를 위해 내장된 NormalizeDouble () 함수를 사용해야 한다고 작성합니다. (개발자가 권장하는 대로)
따라서 먼저 "NormalizeDouble()이란 무엇입니까?", 즉 작동 방식, 작동 알고리즘은 무엇입니까?

MQL4 참조 - 데이터 변환 - NormalizeDouble

부동 소수점 숫자를 지정된 정밀도로 반올림합니다.
...

MQL4에서 반올림을 구성하는 방법을 모르지만(개발자에게 문의해야 함) 부동 소수점 숫자를 지정된 정확도로 반올림하는 표준 방법은 알고 있습니다.
기능은 다음과 같습니다.

double MyNormalizeDouble(double value, int digits)
{
    int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                      с помощью которого мы из VALUE сделаем целое число
    double result = MathRound(factor * value) / factor;
    
    return(result);
}
이 함수에서 먼저 실수에서 정수로 전달한 다음 다시 실수로 전달한다는 것을 알 수 있습니다.
비교를 위해서는 정수로만 전달하면 됩니다.

따라서 가장 빠르고 안정적인 것은 실수를 정수로 변환하는 것이라고 생각합니다.
비교는 다음과 같습니다.

double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
                                                           Если сравниваем цены, то это предопределенная переменная Digits
...

if (MathRound( (а - b) * factor )  !=  0)
{
    ... // a != b
}

if (MathRound( (а - b) * factor )  ==  0)
{
    ... // a == b
}

if (MathRound( (а - b) * factor )  >  0)
{
    ... // a > b
}

if (MathRound( (а - b) * factor )  <  0)
{
    ... // a < b
}

이 모든 것을 함수로 변환하여 사용할 수 있습니다. 쓰기가 끊기고, 함수를 만드는 방법이 명확해 보입니다!
이 방법이 NormalizeDouble()을 호출하는 것보다 빠릅니다.

안정성을 위해 MathRound() 함수가 정수를 반환하도록 만들 수도 있습니다. 그렇지 않으면 기본적으로 double을 반환합니다.
가장 쉬운 방법은

 int MyMathRound(double value)
{
    int result = MathRound(value);
    return(result);
}
그러면 정수만 비교되고 잘 비교됩니다!


이 방법이 일반적으로 가장 정확하다고 생각합니다. 당신은?
 
gravity001 :

따라서 가장 빠르고 안정적인 것은 실수를 정수로 변환하는 것이라고 생각합니다.
비교는 다음과 같습니다.

double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
                                                           Если сравниваем цены, то это предопределенная переменная Digits
...

if (MathRound( (а - b) * factor )  !=  0)
{
    ... // a != b
}

if (MathRound( (а - b) * factor )  ==  0)
{
    ... // a == b
}

if (MathRound( (а - b) * factor )  >  0)
{
    ... // a > b
}

if (MathRound( (а - b) * factor )  <  0)
{
    ... // a < b
}

나는 이 방법이 일반적으로 가장 정확하다고 생각하는데, 당신은?

나는 아니라고 생각한다. 스스로 판단:
Irtron 이 제안한 코드의 아름다움은 간결함입니다(더 이상 아무것도 아닙니다. 변수를 절약하는 것까지!)
그리고 당신은 적어도 각 작업에 대해
(а - b)
두 번 더 작업 중단
(MathRound( (а - b) * factor ) 
그것은 속도의 손실입니다!
 
VBAG :
나는 아니라고 생각한다. 스스로 판단하라

예, 조금 더 천천히
 int start ()
{
    double a , b ;
    int start1 , start2 , end , c ;
    
    a = 1.23450001 ;
    b = 1.23449999 ;
    
    start1 = GetTickCount () ;
    
    for ( c = 100000000 ; c > 0 ; c -- )
        ComparePrice ( a , b , 0.0001 ) ;
    
    start2 = GetTickCount () ;
    
    for ( c = 100000000 ; c > 0 ; c -- )
        intCompare ( a , b , 10000 ) ;
    
    end = GetTickCount () ;
 
    Print ( " ComparePrice: " , start2 - start1 , " , intCompare: " , end - start2 ) ;
 
    return ( 0 ) ;
}
 
int ComparePrice ( double a , double b , double point )
{
    a -= b ;
    b = point / 2 .;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
 
int intCompare ( double a , double b , int factor )
{
    return ( MathRound ( ( a - b ) * factor )) ;
}
비교가격: 32032 , int비교: 35296