MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得 - ページ 13

 
Dmitry Fedoseev:

これは、f/=0.0000001;というのが疑問です。

テスターの課金は不具合があるのは確かだが、それ以外は問題ない )

 

12'345'678'987.9991-1

12'345'678'987.9991-2

 

そして、これは同じ結果で2倍の速さです

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:

そして、これは同じ結果で2倍の速さです

ここで必要なのはスピードではなく、initeで一回、もしくはGUIイベントで行う。ここで重要なのは、動作の正しさです。ダブったものを分割して、端数を 切り捨てるような仕事の正しさはどこから来るのだろう。なんとなく奇跡的に正しく動作しているのかもしれませんが、納得のいくテストが必要です。

 
Dmitry Fedoseev:

ここで必要なスピードは、イニテで一回、もしくはGUIイベントで行います。ここで重要なのは、動作の正しさです。ダブりを分割して端数 部分を捨てているのに、どうして正しく動作するのでしょうか?なんとなく奇跡的に正しく動作しているのかもしれませんが、納得のいくテストが必要です。

まあ、バグが見つかったら(1kkk+などの値以外)ヒントを頂けるとありがたいです。

 
Ilya Malev:

まあ、バグが見つかったら(1kkk+みたいな値を除いて)ヒントをくれるとありがたいんですけどね。

そして、使わないから探さない。なぜ、そのように確信が持てるのですか?

 
Dmitry Fedoseev:

そして、使わないから探さない。なぜ、すべて正しいと断言できるのか不思議です。

0.7,0.07,50000000.9991などのランダムクォートと任意の数字でチェックし、さらに比較スピードテストもしました。ただ、この機能を使うのは、インサイトではなく、もっと頻繁に使うつもりです。でも、一般的には、タンバリンを持って踊らないのであれば、通常のDigitsで 十分なのですが...。

 

9999999999.9999 - dtd2()は7を返し、私のは4です。しかし、それは些細なことです。全体として、この機能は良い、やっと理解できた。

 
Dmitry Fedoseev:

9999999999.9999 - dtd2()は7を返し、私のは4です。しかし、それは些細なことです。全体として、機能が良く、やっと理解できた。

まあ、それはそれとして、自分でも上の方でこの数字をいくつかあげてみました。

 
#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))
 }  

テスト