Fehler, Irrtümer, Fragen - Seite 719

 
ALozovoy:

Gehen Sie zu Ihrem Profil und wählen Sie Service Desk


Dankeschön
 
Rosh:

. ein neues, vollständigeres Beispiel für die Funktion Drucken wurde in die Hilfe aufgenommen:

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)
  }

Da Sie sich mit diesem Problem befasst haben, könnten Sie erklären, woher die zusätzlichen Ziffern kommen, die rot markiert sind.

Ich dachte bisher nur, dass bei IEEE 754 die Anzahl der signifikanten Stellen 17 nicht überschreiten darf, und zwar nicht nach dem Dezimalpunkt, sondern ganz.

 
victorg:

Ich dachte immer, dass bei IEEE 754 die Anzahl der signifikanten Ziffern 17 nicht überschreiten darf, und zwar nicht der Dezimalpunkt, sondern die Summe.

Um ehrlich zu sein, hat mich das nie gestört. Aber hier sind ein paar Links, falls Sie daran interessiert sind:

Ich garantiere nicht, dass es Antworten auf diese Fragen geben wird, aber sie könnten interessant zu lesen sein.

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:

Ehrlich gesagt, hat mich das nie gestört.

Es muss ein Fehler in der Funktion DoubleToString vorliegen.

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

Test (EURUSD,D1)666666.6666666666278616

Dies ist die Funktion, die unnötige signifikante Ziffern erzeugt. Sie sollten nicht dort sein.

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

Es muss ein Fehler in der Funktion DoubleToString vorliegen.

Test (EURUSD,D1)666666.6666666666278616

Dies ist die Funktion, die unnötige signifikante Ziffern erzeugt. Es sollte keine geben.

Sind Sie zu DoubleToString gekommen ? :) Nochmals, ich behaupte nichts: Im Handbuch steht wörtlich Folgendes:

"Liegt der Zahlenwert im Bereich von 0 bis 16, wird die Zeichenkettendarstellung der Zahl mit der angegebenen Anzahl von Dezimalstellen abgerufen. Liegt der Zahlenwert zwischen -1 und -16, so erhält man eine Zeichenkettendarstellung der Zahl im wissenschaftlichen Format mit der angegebenen Anzahl von Nachkommastellen. In allen anderen Fällen hat die Zahlenfolge 8 Dezimalstellen".

Sie haben einen Wert von 30 angegeben. Gemäß der Beschreibung im Referenzhandbuch sollte der String-Wert der Zahl in diesem Fall 8 Dezimalstellen haben.

 
Yedelkin:

Zu DoubleToString gekommen ? :) Nochmals, ich behaupte nichts: Im Referenzhandbuch steht wörtlich Folgendes:

Sie haben einen Wert von 30. Nach der Beschreibung im Referenzhandbuch zu urteilen, sollte der String-Wert der Zahl in diesem Fall überhaupt 8 Dezimalstellen enthalten.

Im Handbuch steht an dieser Stelle auch ein Minuszeichen :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой".
Und das unterstrichene Wort im Satz ist überflüssig. :)
 
Rosh:
Auch das Nachschlagewerk hat an dieser Stelle ein Minuszeichen :)

Ich habe es von hier kopiert: https://www.mql5.com/ru/docs/convert/doubletostring

Der von mir hervorgehobene Satz "In allen anderen Fällen hat der String-Wert der Zahl 8 Dezimalstellen" scheint kein Minuszeichen zu enthalten :/

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64:
Und das unterstrichene Wort im Satz ist überflüssig. :)
Nun, es ist schon eine Ewigkeit her :)
 

Meine Frage ist verloren gegangen.

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

Der Haftbefehl ist immer noch in Kraft.