Arrondir les nombres dans MT4 via NormalizeDouble - page 14

 

Des fonctions pour arrondir le bas et le haut autrefois

Cela pourrait aider quelqu'un

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

Des fonctions pour arrondir le bas et le haut autrefois

Cela pourrait aider quelqu'un

Merci, je vais le prendre pour ma collection.
 
lilita bogachkova:

essayez d'obtenir un résultat de0.99999999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,999999999999999-0,9999999999999

9*X = 9*0.99999999999999999

nous obtenons 9*X = 9 ou X est égal à 1 (un)

v1 = (1/3) = 0,33333333 | v2 = 3*(1/3) = 1,00000000

ou 0.99999999999999999 = 1.0

v1 (1.00000000) >= 1.0

Dans ce cas, 0,999999999999999999999999 représente 1,0. Mais la tâche consiste à "écarter", donc le résultat doit inclure des neuf.
 

Merci à tous pour ce fil de discussion utile !

J'ai choisi la solution d'arrondir un chiffre de plus viaNormalizeDouble, puis de couper le dernier chiffre. Jusqu'à présent, c'est tout à fait convenable.

 

Encore une fois à propos des arrondis......

Veuillez me conseiller sur la situation (ne jetez pas de tomates, je suis un humanitaire),

il existe une telle variable :

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Le delta est normalisé à l'origine,

Les lots de commande devraient probablement renvoyer des dubs normalisés,

mais d'une manière ou d'une autre, à de rares occasions, j'obtiens des chiffres comme 2.775557561562891e-17

Donc c'est presque zéro mais pas zéro.......

Première question : est-ce normal ?

deuxième question - si je comprends bien, il me suffira de faire la deuxième normalisation pour éviter les queues de poisson ?

Troisième question (je sens que je ne la comprendrai pas de toute façon, mais je la pose quand même) :

L'addition de deux nombres normalisés peut-elle donner des nombres non normalisés ?

P.S. Je m'excuse de remettre ça sur le tapis, mais je n'ai pas la force de tout relire.


 
transcendreamer:

Encore une fois à propos des arrondis......

Veuillez me conseiller sur la situation (ne jetez pas de tomates, je suis un humanitaire),

il existe une telle variable :

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

Le delta est normalisé à l'origine,

Les lots de commande devraient probablement renvoyer des dubs normalisés,

mais d'une manière ou d'une autre, à de rares occasions, j'obtiens des chiffres comme 2.775557561562891e-17

Donc c'est presque zéro mais pas zéro.......

Première question : est-ce normal ?

deuxième question - si je comprends bien, il me suffira de faire la deuxième normalisation pour éviter les queues de poisson ?

Troisième question (je sens que je ne la comprendrai pas de toute façon, mais je la pose quand même) :

L'addition de deux nombres normalisés peut-elle donner des nombres non normalisés ?

P.S. Excusez-moi d'en reparler, mais je n'ai pas l'énergie de tout relire.

  1. Oui.
  2. Oui.
  3. Oui.
 
fxsaber:
  1. Oui.
  2. Oui.
  3. Oui.
Merci.
 
transcendreamer:

P.S. Je m'excuse d'avoir remis ça sur le tapis, mais je n'ai pas l'énergie nécessaire pour tout recommencer.

Il est préférable de le vérifier vous-même avec différents exemples, cela vous permettra de comprendre.

Le seul problème, c'est que je m'y prends mal :

if(delta>0)

mais comme ça.

if(delta>0.0)

Pour les numéros doubles. Je ne sais pas si c'est vraiment important, mais je n'ai jamais rencontré d'erreur avec ma variante (j'essaie de ne comparer que les mêmes types de variables).

 
Andrey Dik:

Je ne sais pas si cela a vraiment de l'importance, mais je n'ai jamais rencontré d'erreur avec ma version (j'essaie seulement de comparer les mêmes types de variables).

Ce n'est pas le cas.
 
Certains nombres ne peuvent être représentés que par une fraction infinie, par exemple 1/3 dans le système décimal. Mais 1/3 n'est pas une fraction infinie dans le système tertiaire, là il == 0,1. En d'autres termes, les différents systèmes numériques ont leurs propres fractions infinies. Par conséquent, une fraction non infinie en décimal peut être égale à un en binaire. Par exemple : 0,1, 0,2, 0,3, 0,4, ... n'ont pas de représentation binaire exacte. Si vous appelez NormalizeDouble dix fois, il sera soit 0,1999999999999...1 soit 0,200000...1. Je ne sais pas, c'est peut-être une nouvelle.