MQL4 ve MQL5'te Rakamları () atlayarak herhangi bir sayıdan (sadece tırnak işaretleri değil) sonra ondalık basamak sayısını alma - sayfa 13

 
Dmitry Fedoseev :

İşte burada: f/=0.0000001; şüphe uyandırır.

Katılıyorum, test cihazındaki milyarlar buggy olabilir. diğer durumlarda, sorun değil)

 

12'345'678'987.9991-1

12'345'678'987.9991-2

 

Ve aynı sonuçla iki kat daha hızlı böyle

 int dtd2( double f)
 {
   long l= long (f/ 0.0000001 );
   int d = 0 , i = 10000000 ;
 
   while ( d < 7 && l % i > 0 )
   {
    i /= 10 ;
    d ++ ;
   }

   return d ;
 }
 
Ilya Malev :

Ve aynı sonuçla iki kat daha hızlı böyle

Burada hıza gerek yoktur, bu init veya GUI olayında bir kez yapılır. Buradaki ana şey doğru çalışmadır. İkili bölme yapılırsa, hatta kesirli kısmın reddedilmesi bile işin doğruluğu nereden gelecek? Belki bir mucize eseri düzgün çalışır, ancak ikna edici bir test yapmanız gerekir.

 
Dmitry Fedoseev :

Burada hıza gerek yoktur, bu init veya GUI olayında bir kez yapılır. Buradaki ana şey doğru çalışmadır. İkili bölme yapılırsa, hatta kesirli kısmın reddedilmesi bile işin doğruluğu nereden gelecek? Belki bir mucize eseri düzgün çalışır, ancak ikna edici bir test yapmanız gerekir.

Peki bug bulursanız (1kkkk+ gibi değerler hariç) ipuçları için minnettar kalırım.

 
Ilya Malev :

Peki bug bulursanız (1kkkk+ gibi değerler hariç) ipuçları için minnettar kalırım.

Ve bakmayacağım çünkü kullanmayacağım. Sadece merak ediyorum, her şeyin doğru olacağına nasıl bu kadar güveniyorsun?

 
Dmitry Fedoseev :

Ve bakmayacağım çünkü kullanmayacağım. Sadece merak ediyorum, her şeyin doğru olacağına nasıl bu kadar güveniyorsun?

0.7.07, 50000000.9991, vb. gibi rastgele alıntıları ve rastgele sayıları kontrol ettim ve ayrıca karşılaştırmalı hız testleri yaptım. Ben sadece bu işlevi kullanırsam init'te değil, çok daha sık kullanırım. Ve genel olarak, teflerle dans etmezseniz, normal Rakamlar yeterlidir ...

 

Bir sayı bulundu: 9999999999.9999 - dtd2() 7'yi ve benimki 4'ü döndürür. Ama bu önemsiz bir şey. Genel olarak, işlev iyidir, sonunda anladım.

 
Dmitry Fedoseev :

Bir sayı bulundu: 9999999999.9999 - dtd2() 7'yi ve benimki 4'ü döndürür. Ama bu önemsiz bir şey. Genel olarak, işlev iyidir, sonunda anladım.

Bunun hakkında konuştum, kendim yukarıda birkaç numaradan bahsettim.

 
#property strict

#define test(M,EX) { uint mss= GetTickCount (); int nn=( int ) pow ( 10 ,M); for ( int tst= 0 ;tst<nn;tst++){EX;} printf ( "loops=%i ms=%u" ,nn, GetTickCount ()-mss);}

int d( double x){
   int n;
   for (n= 0 ;n< 8 ;n++){
       if (x== NormalizeDouble (x,n)){
         return (n);
      }
   }
   return (n- 1 );
}

int dtd2( double f)
 {
   long l= long (f/ 0.0000001 );
   int d = 0 , i = 10000000 ;
 
   while ( d < 7 && l % i > 0 )
   {
    i /= 10 ;
    d ++ ;
   }

   return d ;
 }
 
int dtd3( double f)
 {
   long l= long (f/ 0.0000001 );
 
   if (l% 10 == 0 )
   if (l% 100 == 0 )
   if (l% 1000 == 0 )
   if (l% 10000 == 0 )
   if (l% 100000 == 0 )
   if (l% 1000000 == 0 )
   if (l% 10000000 == 0 )
     return 0 ; else
     return 1 ; else
     return 2 ; else
     return 3 ; else
     return 4 ; else
     return 5 ; else
     return 6 ; else
     return 7 ;
 }

void OnStart ()
 {
   srand ( GetTickCount ());
   Print ( "d:" );
  test( 7 , int k= rand ()% Bars ; double f= Close [k]* rand ()/( rand ()+ 1.0 );d(f))
   Print ( "dtd2:" );
  test( 7 , int k= rand ()% Bars ; double f= Close [k]* rand ()/( rand ()+ 1.0 );dtd2(f))
   Print ( "dtd3:" );
  test( 7 , int k= rand ()% Bars ; double f= Close [k]* rand ()/( rand ()+ 1.0 );dtd3(f))
 }  

Ölçek