... un nouvel exemple, plus complet, de la fonction Imprimer a été ajouté à l'aide :
voidOnStart()
{
//--- выведем DBL_MAX с помощью Print(), это равносильно PrintFormat(%%.16G,DBL_MAX)Print("---- как выглядит DBL_MAX -----");
Print("Print(DBL_MAX)=",DBL_MAX);
//--- теперь выведем число DBL_MAX с помощью PrintFormat()PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Вывод в журнал "Эксперты"// Print(DBL_MAX)=1.797693134862316e+308// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308//--- посмотрим как выводится тип floatfloat c=(float)M_PI; // нужно явно приводить к целевому типуPrint("c=",c, " Pi=",M_PI, " (float)M_PI=",(float)M_PI);
// c=3.14159 Pi=3.141592653589793 (float)M_PI=3.14159//--- покажем, что может произойти при арифметических операциях над вещественными типамиdouble a=7,b=200;
Print("---- перед арифметическими операциями");
Print("a=",a," b=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- разделим a на b (7/200)
a=a/b;
//--- теперь как будто восстановим значение в переменной b
b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так//--- выведем вновь вычисленное значение bPrint("----- после арифметических операций");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"// Print(b)=200.0// Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0) //--- создадим очень маленькое значение epsilon=1E-013double epsilon=1 e-13;
Print("---- создадим очень маленькое число");
Print("epsilon=",epsilon); // получим epsilon=1E-013//--- теперь вычтем эпсилон из числа b и выведем снова значение в журнал "Эксперты"
b=b-epsilon;
//--- выводим двумя способамиPrint("---- после вычитания epsilon из переменной b");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"// Print(b)=199.9999999999999 (теперь значение b после вычитания эпсилон не может округлиться до 200)// Print(DoubleToString(b,16))=199.9999999999998578// (теперь значение b после вычитания эпсилон не может округлиться до 200)
}
Puisque vous avez traité cette question, pourriez-vous expliquer d'où viennent les chiffres supplémentaires, ils sont marqués en rouge.
Je pensais auparavant que pour IEEE 754 le nombre de chiffres significatifs ne peut pas dépasser 17, et pas après le point décimal, mais tous.
J'avais juste l'habitude de penser que pour IEEE 754, le nombre de chiffres significatifs ne peut pas dépasser 17, et pas le point décimal, mais le total.
Honnêtement, ça ne m'a jamais dérangé. Mais voici quelques liens si vous êtes intéressés :
arithmetic formats: sets of binary and decimal floating-point data, which consist of finite numbers (including signed zeros and subnormal numbers), infinities, and special "not a number" values (NaNs) interchange formats: encodings (bit strings) that may be used to exchange floating-point data in an efficient and compact form rounding rules...
C'est la fonction qui génère les chiffres significatifs inutiles. Il ne devrait pas y en avoir.
Êtes-vous arrivé à DoubleToString ? :) Encore une fois, je ne prétends rien : le manuel dit littéralement ce qui suit :
"Si la valeur des chiffres est comprise entre 0 et 16, la représentation de la chaîne de caractères du nombre sera récupérée avec le nombre de décimales spécifié. Si la valeur des chiffres est comprise entre -1 et -16, on obtient une représentation en chaîne du nombre au format scientifique avec le nombre de décimales spécifié. Dans tous les autres cas, la chaîne de chiffres aura 8 décimales".
Vous avez spécifié une valeur de 30. Selon la description du manuel de référence, la valeur de la chaîne de caractères du nombre doit avoir 8 décimales dans ce cas.
Vous êtes arrivé à DoubleToString ? :) Encore une fois, je ne prétends rien : le manuel de référence dit littéralement ce qui suit :
Vous avez une valeur de 30. Si l'on en juge par la description du manuel de référence, la valeur de la chaîne d'un nombre devrait dans ce cas contenir 8 décimales au total.
Le manuel comporte également un signe moins à cet endroit :)
La phrase que j'ai mise en évidence, "Dans tous les autres cas, la valeur de la chaîne du nombre aura 8 décimales" ne semble pas contenir de signe moins :/.
Allez dans votre profil et sélectionnez Service Desk
... un nouvel exemple, plus complet, de la fonction Imprimer a été ajouté à l'aide :
Puisque vous avez traité cette question, pourriez-vous expliquer d'où viennent les chiffres supplémentaires, ils sont marqués en rouge.
Je pensais auparavant que pour IEEE 754 le nombre de chiffres significatifs ne peut pas dépasser 17, et pas après le point décimal, mais tous.
J'avais juste l'habitude de penser que pour IEEE 754, le nombre de chiffres significatifs ne peut pas dépasser 17, et pas le point décimal, mais le total.
Honnêtement, ça ne m'a jamais dérangé. Mais voici quelques liens si vous êtes intéressés :
Je ne garantis pas qu'il y aura des réponses à ces questions, mais elles peuvent être intéressantes à lire.
Honnêtement, ça ne m'a jamais dérangé.
Il doit y avoir un problème avec la fonction DoubleToString.
Test (EURUSD,D1)666666.66666666278616
C'est la fonction qui génère les chiffres significatifs inutiles. Ils ne devraient pas être là.
Il doit y avoir un problème avec la fonction DoubleToString.
Test (EURUSD,D1)666666.66666666278616
C'est la fonction qui génère les chiffres significatifs inutiles. Il ne devrait pas y en avoir.
Êtes-vous arrivé à DoubleToString ? :) Encore une fois, je ne prétends rien : le manuel dit littéralement ce qui suit :
"Si la valeur des chiffres est comprise entre 0 et 16, la représentation de la chaîne de caractères du nombre sera récupérée avec le nombre de décimales spécifié. Si la valeur des chiffres est comprise entre -1 et -16, on obtient une représentation en chaîne du nombre au format scientifique avec le nombre de décimales spécifié. Dans tous les autres cas, la chaîne de chiffres aura 8 décimales".
Vous avez spécifié une valeur de 30. Selon la description du manuel de référence, la valeur de la chaîne de caractères du nombre doit avoir 8 décimales dans ce cas.
Vous êtes arrivé à DoubleToString ? :) Encore une fois, je ne prétends rien : le manuel de référence dit littéralement ce qui suit :
Vous avez une valeur de 30. Si l'on en juge par la description du manuel de référence, la valeur de la chaîne d'un nombre devrait dans ce cas contenir 8 décimales au total.
Le livre de référence comporte également un signe moins à cet endroit :)
Je l'ai copié d'ici : https://www.mql5.com/ru/docs/convert/doubletostring
La phrase que j'ai mise en évidence, "Dans tous les autres cas, la valeur de la chaîne du nombre aura 8 décimales" ne semble pas contenir de signe moins :/.
Et le mot souligné dans la phrase est redondant. :)
Ma question s'est perdue.
https://www.mql5.com/ru/forum/1111/page721#comment_179003
Le mandat est toujours en suspens.