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

 
Ilya Malev :

(지겹게도) 이것이 문제라면 "'k' - redefinition; different type modifiers"라는 에러가 나지만 화면에는 나오지 않는다. 따라서 컴파일러는 신경 쓰지 않으며 그게 요점이 아닙니다.

아 글쎄...

 
Alexey Navoykov :

아 글쎄...

글쎄, 그것을 스스로 컴파일 해보십시오. 포럼에서 이 주제에 대한 게시물을 작성하기에 너무 게으르지 않다면 너무 게으르지 않고 편집기로 몰아넣고 F7 키를 누르십시오. 훨씬 빠릅니다.

 

정수의 이진 로그를 계산하는 빠른 방법. MathLog 를 통한 계산보다 3-5배 더 빠르게 작동합니다.

 int log2( ulong n)
{
   if (n== 0 ) return - 1 ;
  
  #define S(k) if (n >= ( ulong ( 1 )<<k)) { i += k;  n >>= k; }
  
   int i= 0 ;  S( 32 );  S( 16 );  S( 8 );  S( 4 );  S( 2 );  S( 1 );   return i;
  
  #undef S
}
 
MQL5로 작성된 Expert Advisor가 MT4 터미널에서 작동합니까? 나는 그것이 작동 할 것이라는 것을 어딘가에서 읽었습니다.
 
Alexey Navoykov :

정수의 이진 로그를 계산하는 빠른 방법. MathLog를 통한 계산보다 3~5배 빠르게 작동합니다.

나는 다음과 같은 기능을 사용합니다(순수한 샤머니즘이지만 작동합니다).

 static const uint ulLogTable[ 64 ] = 
{
0 , 58 , 1 , 59 , 47 , 53 , 2 , 60 , 39 , 48 , 27 , 54 , 33 , 42 , 3 , 61 ,
51 , 37 , 40 , 49 , 18 , 28 , 20 , 55 , 30 , 34 , 11 , 43 , 14 , 22 , 4 , 62 ,
57 , 46 , 52 , 38 , 26 , 32 , 41 , 50 , 36 , 17 , 19 , 29 , 10 , 13 , 21 , 56 ,
45 , 25 , 31 , 35 , 16 , 9 , 12 , 44 , 24 , 15 , 8 , 23 , 7 , 6 , 5 , 63 
};


uint _FastLog2( ulong ulInput)
{
   ulInput |= ulInput >> 1 ;
   ulInput |= ulInput >> 2 ;
   ulInput |= ulInput >> 4 ;
   ulInput |= ulInput >> 8 ;
   ulInput |= ulInput >> 16 ;
   ulInput |= ulInput >> 32 ;
  
   return (ulLogTable[( uint )((ulInput * 0x03f6eaf2cd271461 ) >> 58 )]);
};

두 기능 모두 동일한 정답을 제공하며 오류를 찾지 못했습니다.

작업 속도를 비교하는 것은 흥미롭습니다. 내 버전에서는 시프트와 덧셈 연산이 조금 덜하지만 끝에 곱셈이 있습니다. Aleksey 버전에는 시프트 및 덧셈 연산이 조금 더 있지만 곱셈은 없습니다. 얼마나 빠릅니까?

 
이 주제와 관련이 없는 댓글은 " MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 
이 주제와 관련이 없는 댓글은 " MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 
Georgiy Merts :

내 버전에서는 시프트와 덧셈 연산이 조금 덜하지만 끝에 곱셈이 있습니다. Aleksey 버전에는 시프트 및 덧셈 연산이 조금 더 있지만 곱셈은 없습니다. 얼마나 빠릅니까?

시프트 및 덧셈 연산이 있습니다 - 6 개 이하 (이진 검색). Shift(ulong)1<<k는 고려되지 않습니다. 그것은 상수입니다. 거기에 가는 유일한 것은 또한 상태 확인입니다. 조건 검사는 없지만 항상 6가지 연산, 곱셈, 1번의 시프트, 관리되는 배열에 대한 액세스(예: 인덱스 검사)가 있습니다. 따라서 속도 측면에서 분명히 귀하의 선택은 느려질 것입니다. 할머니에게도 가지 마십시오. :)

네, 그리고 당신의 버전은 확실히 신비로워 보입니다)

추신: 내 코드가 if-else를 통해 비교 체인으로 확장되고 모든 산술 연산 을 제거하면 엄청난 속도 향상을 얻을 수 있다는 가정이 있습니다. 그러나 이것은 코드의 큰 발판입니다. 매크로에서 재귀를 사용할 수만 있다면...

 
Georgiy Merts :

작업 속도를 비교하는 것은 흥미롭습니다.

변형 log2가 더 빠릅니다.

 #property strict
#define   test(M,S,EX)        { uint mss= GetTickCount (); uint nn=( uint ) pow ( 10 ,M); for ( uint t12= 0 ;t12<nn;t12++){EX;} \
                                 printf ( "%s: loops=%i ms=%u" ,S,nn, GetTickCount ()-mss);}

int log2( ulong n){
   if (n== 0 ) return - 1 ;
   #define S(k) if (n >= ( ulong ( 1 )<<k)) { i += k;  n >>= k; }
   int i= 0 ;  S( 32 );  S( 16 );  S( 8 );  S( 4 );  S( 2 );  S( 1 );   return i;
   #undef S}


static const uint ulLogTable[ 64 ] = {
0 , 58 , 1 , 59 , 47 , 53 , 2 , 60 , 39 , 48 , 27 , 54 , 33 , 42 , 3 , 61 ,
51 , 37 , 40 , 49 , 18 , 28 , 20 , 55 , 30 , 34 , 11 , 43 , 14 , 22 , 4 , 62 ,
57 , 46 , 52 , 38 , 26 , 32 , 41 , 50 , 36 , 17 , 19 , 29 , 10 , 13 , 21 , 56 ,
45 , 25 , 31 , 35 , 16 , 9 , 12 , 44 , 24 , 15 , 8 , 23 , 7 , 6 , 5 , 63 };

uint _FastLog2( ulong ulInput){
   ulInput |= ulInput >> 1 ;
   ulInput |= ulInput >> 2 ;
   ulInput |= ulInput >> 4 ;
   ulInput |= ulInput >> 8 ;
   ulInput |= ulInput >> 16 ;
   ulInput |= ulInput >> 32 ;  
   return (ulLogTable[( uint )((ulInput * 0x03f6eaf2cd271461 ) >> 58 )]);};

void OnStart (){
   srand ( GetTickCount ());
   ulong n,n1;
  test( 8 , "MathLog" ,n= rand ()* rand ();n1= ulong ( MathLog (n)/ MathLog ( 2 )))
  test( 8 , "log2" ,n= rand ()* rand ();n1=log2(n);)
  test( 8 , "_FastLog2" ,n= rand ()* rand ();n1=_FastLog2(n))}


 
Ilya Malev :

변형 log2가 더 빠릅니다.


이해했다.

제 기능을 대신하고 있습니다.

사유: