NormalizeDouble paradoxe

 

Bon après-midi !

J'ai beau lire cette section d'aide, je n'arrive toujours pas à comprendre d'où vient cette fraction de 1 à la fin.

Gardez à l'esprit que lorsqu'un nombre normalisé est envoyé au Journal à l'aide de la fonction Print(), il peut contenir plus de décimales que prévu. Par exemple,

double a=76.671 ;// nombre normalisé avec 3 décimales
Print("Print(76.671)=",a) ;// l'imprimer tel quel
Print("DoubleToString(a,8)=",DoubleToString(a,8)) ;// l'imprimer avec la précision spécifiée

est émis dans le terminal :

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

 
transcendreamer:

Bon après-midi !

J'ai beau lire cette section d'aide, je n'arrive toujours pas à comprendre d'où vient cette fraction de 1 à la fin.

Gardez à l'esprit que lorsqu'un nombre normalisé est imprimé dans le Journal à l'aide de la fonction Print(), il peut contenir plus de décimales que prévu. Par exemple,

double a=76.671 ;// nombre normalisé avec 3 décimales
Print("Print(76.671)=",a) ;// l'imprimer tel quel
Print("DoubleToString(a,8)=",DoubleToString(a,8)) ;// l'imprimer avec la précision spécifiée

est émis dans le terminal :

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

Le type double a des limites de précision en raison desquelles des erreurs peuvent se produire.

Je vous recommande cet article : https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED:

Le type double a des limites en matière de précision, ce qui peut entraîner des erreurs.

Je vous recommande cet article : https://www.mql5.com/ru/articles/1561

Je vois la recommandation, merci.

Vous pouvez utiliser DoubleToStr lors de l'édition de

mais on ne sait pas très bien d'où vient celle-là !

Si je faisais une division/multiplication, OK, c'est OK, c'est une erreur.

Mais dans une constante ? Que j'ai moi-même prescrite ?

Il s'avère que je dois utiliser l'arrondi pour une constante qui n'a pas cette précision au départ .

et surtout, la confiance dans ce qui est réellement stocké dans la double variable est sapée !

 

Citation de la documentation

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

Par exemple, les nombres 0,3 et 0,7 sont représentés dans l'ordinateur comme des fractions infinies, tandis que le nombre 0,25 est stocké exactement comme une puissance de deux.

 
stringo:

Citation de la documentation

intéressant...

Je devine déjà que le problème ne se trouve pas dans le MQL mais quelque part plus profondément, au niveau des normes 80.

mais toujours très étrange...

Je ne l'ai vu dans aucune autre langue d'application.

il serait raisonnable de prévoir des solutions de contournement au niveau du langage MQL lui-même.

 

et cela n'explique toujours pas pourquoi le code ci-dessous donne 0000000001 pile.

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

parce que j'ai fait la normalisation

et le numéro est toujours en queue.

 
transcendreamer:

intéressant...

Je devine déjà qu'il ne s'agit pas de MQL mais d'un problème plus profond, au niveau des normes des années 80.

mais c'est toujours très étrange...

Je n'ai vu cela dans aucune autre langue d'application.

il serait raisonnable d'avoir des solutions de contournement au niveau de MQL

Qu'est-ce qu'il y a de si difficile ?

Si vous avez besoin d'une précision jusqu'à 4 chiffres. Multipliez le nombre par 10000, éliminez la partie fractionnaire et divisez par 10000.

Les fonctions mathématiques de mql peuvent être trouvées dans la documentation.

 

text = "Positions fermées à " + (string)current + " pour le portefeuille : " + portfolio_name ;

DoubleTo String pour le courant et tout ira bien.

 

Oui, j'ai déjà réalisé que nous devons forcer les arrondis.

NormalizeDouble ne fait apparemment pas l'affaire.

 
transcendreamer:

Oui, j'ai déjà réalisé que nous devons forcer les arrondis.

NormalizeDouble ne semble pas faire le travail

NormalizeDouble est exactement la façon dont il fonctionne (et a toujours fonctionné de cette façon, à partir du premier MQL)

Un nombre est multiplié par 10 à la puissance des chiffres, converti en nombre entier (en éliminant la partie fractionnaire), puis divisé par 10 à la puissance des chiffres.

Quel est le problème ? Casser le modèle ?

 
stringo:

NormalizeDouble fonctionne exactement comme ceci (et a toujours fonctionné comme ceci depuis le premier MQL)

Le nombre est multiplié par 10 à la puissance des chiffres, converti en nombre entier (en éliminant la partie fractionnaire), puis divisé par 10 à la puissance des chiffres.

Quel est le problème ? Casser le modèle ?

Une rupture de tendance est que même après normalisation il y a des queues !