Arrondir les nombres dans MT4 via NormalizeDouble - page 4

 
Dmitry Fedoseev:
C'est parce qu'il est de 0,6, donc 0,5 ne peut être obtenu qu'en trichant.

double v1 = 1.1234567;

Si 'v1' est inséré dans un nombre quelconque, cela montre qu'il est arrondi correctement à 'i = 2'.

 
lilita bogachkova:

Si l'on insère "v1" dans un nombre quelconque, on constate que jusqu'à "i = 2", tout est arrondi correctement.

C'est faux après i = 2 ?
 
Ihor Herasko:

Lorsqu'un seul chiffre est normalisé, c'est simple : 0, 1, 2, 3, 4 -> 0, et 5, 6, 7, 8, 9 -> 1.

Lors de la normalisation, les nombres à deux chiffres sont pris en compte : 0 - 49 -> 0, et 50 - 99 -> 1. Après tout, si le nombre 1,49 doit être arrondi aux nombres entiers, devons-nous vraiment obtenir 2, qui représente 51 centièmes par rapport aux 49 centièmes de distance à 1 disponibles ?

Il en va de même pour les chiffres à trois, quatre, etc.

Mais 1,45 est arrondi à 2, mais seulement s'il a été préalablement normalisé à un degré de précision supérieur.

void OnStart()
  {
   for(int i=7;i>=0;i--)
     {
      double v1 = 1.4545454;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }


v1 = 0 = 1.0000000, v2 = 0 = 2.0000000

v1 = 1 = 1,5000000, v2 = 1 = 1,5000000

v1 = 2 = 1,4500000, v2 = 2 = 1,4600000

v1 = 3 = 1,4550000, v2 = 3 = 1,4550000

il s'avère que si dans les calculs du nombre a été normalisé à une précision plus élevée et dans les calculs ultérieurs à normaliser le nombre à une précision inférieure sera le résultat d'une différente de la simplement normalisé ce nombre à une précision inférieure.


 
lilita bogachkova:

il s'avère que si, dans le calcul, le nombre a été normalisé à une précision supérieure et que, dans les calculs suivants, le nombre est normalisé à une précision inférieure, le résultat est différent de la simple normalisation du nombre à une précision inférieure.


Au-dessus, de telles actions sont appelées "tricherie")) Les mathématiques, bien qu'étant une science exacte, doivent néanmoins être appliquées avec compréhension. 2 + 3 = 5, mais si 2 seaux plus 3 poulets, alors 5 ne fonctionnera pas ;))
 

Excusez-moi, mais comment obtenir les valeurs que vous voulez ?

Si j'utilise les fonctions recommandées, alors :

- Dans un cas, j'obtiens une valeur correctement arrondie
0.06-0.02 =NormalizeDouble(0.03999999999999999,2) = 0.04
La division est approximative et la normalisation est nécessaire.

- Dans le second cas, j'obtiens également un arrondi, mais il n'est pas nécessaire dans ce cas
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
La normalisation (arrondi) n'est pas nécessaire ici.

Mais comment normaliser au lieu d'arrondir ?

 
Roman Starinskij:

Excusez-moi, mais comment obtenir les valeurs que vous voulez ?

Pour cela, il convient de formuler ce que sont les "bonnes valeurs". ))

Si j'utilise les fonctions recommandées, alors :

- Dans un cas, j'obtiens une valeur correctement arrondie.
0.06-0.02 = NormalizeDouble(0.0399999999999999999,2) = 0.04
La division est approximative et vous ne pouvez pas vous passer de la normalisation.

- Dans le second cas, j'obtiens également l'arrondi, mais il n'est pas nécessaire dans ce cas.
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
La normalisation (arrondi) n'est pas nécessaire ici.

Mais comment normaliser correctement, plutôt que d'arrondir les valeurs ?

L'exemple ci-dessus montre que vous utilisez un algorithme intuitif qui détermine la "justesse" de la normalisation. Dans le premier cas, il s'agit d'une fraction infinie, alors que dans le second cas, il s'agit d'une fraction finie. Adaptez votre algorithme pour convertir le nombre réel à la forme souhaitée.

Bien que le moyen le plus simple soit de décider à l'avance de la précision requise des calculs.

 
Ihor Herasko:

Pour ce faire, il convient simplement de formuler ce que sont les "bonnes valeurs". ))

Dans l'exemple ci-dessus, vous pouvez voir que vous utilisez un algorithme intuitif qui vous permet de déterminer la "nécessité" de la normalisation. Dans le premier cas, il s'agit d'une fraction infinie, alors que dans le second cas, il s'agit d'une fraction finie. Adaptez votre algorithme pour convertir le nombre réel à la forme souhaitée.

Le plus simple est de décider à l'avance de la précision dont vous avez besoin.


J'ai juste besoin d'obtenir les mêmes chiffres, que j'avais l'habitude d'obtenir dans la calculatrice. :-) Ce sont les valeurs dont vous avez besoin.
Ainsi, avec "0,06-0,02", on obtient "0,04" et avec "0,06-0,024", on obtient "0,036".
 
Roman Starinskij:

J'ai juste besoin d'obtenir les mêmes chiffres que ceux que j'ai l'habitude d'obtenir avec une calculatrice. :-) Ce sont les valeurs dont vous avez besoin.
Si vous voulez "0,06-0,02", vous obtiendrez "0,04" et si vous voulez "0,06-0,024", vous obtiendrez "0,036".
Si vous voulez obtenir 0,036 (3 décimales), vous devez normaliser à 3 décimales, et non à 2.
 
Dmitry Fedoseev:
Si vous voulez 0,036 (3 décimales), normalisez à 3, pas à 2.

Je me suis trompé, jusqu'à 3 chiffres devraient être normalisés. Est-il possible de le faire ?

 
Roman Starinskij:

Je me suis trompé, jusqu'à 3 chiffres devraient être normalisés. Est-ce que ça va marcher comme ça ?

Voici votre code :

0.06-0.024 = NormalizeDouble(0.036,2) = 0.04

Au lieu de 2, mettez 3 et ça fera 0,036.