Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5 - page 13

 
Dmitry Fedoseev:

Celui-là : f/=0.0000001 ; est douteux.

Je suis d'accord, les milliards dans le testeur peuvent avoir des problèmes. Sinon, c'est bon.)

 

12'345'678'987.9991-1

12'345'678'987.9991-2

 

Et ceci est deux fois plus rapide avec le même résultat.

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:

Et ceci est deux fois plus rapide avec le même résultat.

Ce n'est pas la vitesse dont vous avez besoin ici, c'est fait une fois dans l'inite ou par événement GUI. L'essentiel ici est la régularité du fonctionnement. D'où viendra la justesse du travail, si un double est divisé et que la partie fractionnée est rejetée ? Peut-être qu'il fonctionne correctement par miracle, mais vous avez besoin d'un test convaincant.

 
Dmitry Fedoseev:

La vitesse nécessaire ici n'est pas la vitesse nécessaire, elle est faite une fois dans l'inite ou par un événement GUI. L'essentiel ici est la justesse de l'opération. Comment peut-il fonctionner correctement s'il divise le dubble et rejette la partie fractionnée? Peut-être qu'il fonctionne correctement par miracle, mais vous avez besoin d'un test convaincant.

Si vous trouvez des bugs (autres que des valeurs comme 1kkk+), je vous serais reconnaissant de me donner des conseils.

 
Ilya Malev:

Si vous trouvez des bugs (sauf pour des valeurs comme 1kkk+), je vous serais reconnaissant de me donner des conseils.

Et je ne les chercherai pas, car je ne vais pas les utiliser. Par simple curiosité, comment pouvez-vous être si sûr que tout sera correct ?

 
Dmitry Fedoseev:

Et je ne le chercherai pas, parce que je ne vais pas l'utiliser. Je me demande juste comment vous pouvez être si sûr que tout sera correct ?

J'ai vérifié sur des citations aléatoires et des nombres arbitraires comme 0.7,0.07, 50000000.9991 etc., et en plus j'ai fait des tests comparatifs de vitesse. Je vais juste utiliser cette fonction, mais pas en inite, mais beaucoup plus souvent. Mais en général, si vous ne dansez pas avec des tambourins, le Digits habituel suffit amplement...

 

J'ai trouvé un seul nombre : 999999999999.9999 - dtd2() retourne 7 et le mien est 4. Mais c'est une broutille. Dans l'ensemble, la fonction est bonne, je la comprends enfin.

 
Dmitry Fedoseev:

J'ai trouvé un seul nombre : 999999999999.9999 - dtd2() retourne 7 et le mien est 4. Mais c'est une broutille. Dans l'ensemble, la fonction est bonne et je l'ai enfin comprise.

Eh bien, c'est ce que j'ai dit, j'ai donné quelques-uns de ces chiffres au-dessus de moi.

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

Test