Erreurs, bugs, questions - page 719

 
ALozovoy:

Allez dans votre profil et sélectionnez Service Desk


Merci.
 
Rosh:

... un nouvel exemple, plus complet, de la fonction Imprimer a été ajouté à l'aide :

void OnStart()
  {
//--- выведем 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
 
//--- посмотрим как выводится тип float
   float 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 - но это не так
//--- выведем вновь вычисленное значение b
   Print("----- после арифметических операций");
   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-013
   double 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.

 
victorg:

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.

IEEE floating point - Wikipedia, the free encyclopedia
  • en.wikipedia.org
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...
 
Rosh:

Honnêtement, ça ne m'a jamais dérangé.

Il doit y avoir un problème avec la fonction DoubleToString.

void OnStart()
  {
  double a=2000000.0/3.0;
  Print(DoubleToString(a,30));
  }

Test (EURUSD,D1)666666.66666666278616

C'est la fonction qui génère les chiffres significatifs inutiles. Ils ne devraient pas être là.

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
victorg:

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.

 
Yedelkin:

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 :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой".
Et le mot souligné dans la phrase est redondant. :)
 
Rosh:
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 :/.

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64:
Et le mot souligné dans la phrase est redondant. :)
Eh bien, ça fait des années :)
 

Ma question s'est perdue.

https://www.mql5.com/ru/forum/1111/page721#comment_179003

Le mandat est toujours en suspens.