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

 
Ilya Malev:

C'est probablement la meilleure solution

il n'est pas correct de comparer des doubles sur l'égalité, de plus, la tâche est d'être exact au signe.

Regardez le fichier stdlib.mq4 dans MT4, il y avait un exemple de double comparaison correcte

CompareDoubles()

SZZ : voici un article sur le sujethttps://www.mql5.com/ru/articles/1561.

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Je me demande comment vous ferez les logarithmes, l'exponentiation avec des nombres non entiers, la trigonométrie, ..... utiliser des bibliothèques tierces, des indicateurs... Ils ont tous des erreurs !

Si vous avez besoin d'une précision super-méga, vous pouvez utiliser des bibliothèques externes spéciales comme gnu mp

Sinon, si vous avez besoin d'une précision garantie (lorsque l'erreur est calculée à chaque opération), vous devez utiliser toutes sortes de "libs d'intervalle".

si même cela ne suffit pas - vous pouvez utiliser des polynômes au lieu de chiffres

mais je n'ai jamais vu de tels cas, lorsque de tels circuits sont vraiment nécessaires pour MT:-)

il y a un double pour l'œil :-)

 
Igor Makanu:

il n'est pas correct de comparer des doubles sur l'égalité, en outre, la tâche est d'être exact à un signe

Regardez le fichier stdlib.mq4 dans MT4, il y avait un exemple de double comparaison correcte

CompareDoubles()

Avec CompareDoubles, le temps d'exécution est multiplié par deux. Alors c'est mieux comme ça :

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

Bien, bien, et le temps d'exécution avec CompareDoubles s'envole d'un facteur deux. Vous feriez mieux de faire comme ça :

Nous parlons de calcul correct, je ne peux pas vérifier votre code maintenant, mais ce n'est pas difficile, vous devez comparer votre exemple avec un exemple utilisant DoubleToStr() dans la boucle, s'il n'y a pas de différence, alors tout est correct.

ZS : J'ai essayé avec fmod() je pense que j'ai posté un exemple, il ne fonctionne pas correctement, comme à 0.07 devrait vérifier - immédiatement un bug a surgi

 
Igor Makanu:

Nous parlons de calcul correct, je ne peux pas vérifier votre code maintenant, mais ce n'est pas difficile, vous devez comparer votre exemple avec l'exemple utilisant DoubleToStr() dans la boucle, s'il n'y a pas de différence, alors tout est correct.

J'ai déjà vérifié et calculé la vitesse et c'est la meilleure solution. Sauf si vous devez rechercher plus de 7 caractères, bien sûr.

S.s. 0,7 et 0,07 et 500000000,0001, etc. tous calculés correctement.

s.s. Mais pour 500000000.9991, ça se gère moins bien. Mais cela n'a guère d'importance dans la pratique du forex.

 
Ilya Malev:

Mais dans la pratique du forex, cela n'a guère d'importance.

cela dépend du problème. s'il s'agit d'ordres de transaction, alors ce problème n'a pas de sens - les prix sont normalisés par rapport aux chiffres, tandis que les lots sont relatifs au lot minimum.

Si le problème concerne la modélisation mathématique, cela peut être utile.

 
Igor Makanu:

cela dépend du problème, si c'est pour des ordres de négociation, alors cette tâche n'a aucun sens - les prix sont normalisés par rapport aux chiffres, et les lots sont relatifs au lot minimum.

Si la tâche consiste en une modélisation mathématique, elle peut être utile.

Bien sûr, il ne s'agit pas d'écrire des réseaux neuronaux =))) et de dire qu'il est pratique de stocker les prix/lots/monnaie sous la forme d'un entier de 4 octets avec une valeur décimale, ce qui réduit la taille des données de 2 fois.

 
Igor Makanu:

il n'est pas correct de comparer des doubles sur l'égalité, en outre, la tâche est d'être exact à un signe

Regardez le fichier stdlib.mq4 dans MT4, il y avait un exemple de double comparaison correcte

CompareDoubles()

SZZ : voici un article sur le sujethttps://www.mql5.com/ru/articles/1561.

La tâche consiste donc à déterminer de combien de chiffres x est normalisé. Donc c'est bon. A moins que vous n'ayez été trop paresseux pour écrire une telle échelle.

 
Dmitry Fedoseev:

A moins que vous n'ayez été trop paresseux pour écrire une telle échelle.

Vous pouvez le faire sans échelle, mais cela prend 10% de plus.

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

  return d ;
 }
 
Ilya Malev:

Vous pouvez le faire sans échelle, mais cela prend 10% de plus.

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

Raison: