Errores, fallos, preguntas - página 719

 
ALozovoy:

Vaya a su perfil y seleccione Service Desk


Gracias
 
Rosh:

. se ha añadido a la ayuda un nuevo ejemplo más completo para la función de impresión:

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

Ya que has tratado este tema, podrías explicar de dónde vienen los dígitos extra, que están marcados en rojo.

Sólo que antes pensaba que para el IEEE 754 el número de dígitos significativos no puede ser superior a 17, y no después del punto decimal, sino todo.

 
victorg:

Sólo pensaba que para el IEEE 754 el número de dígitos significativos no puede exceder de 17, y no el punto decimal, sino el total.

Sinceramente, nunca me molestó. Pero aquí tienes un par de enlaces por si te interesa:

No garantizo que haya respuestas a estas preguntas, pero puede ser interesante leerlas.

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:

Sinceramente, nunca me molestó.

Debe haber algún problema con la función DoubleToString.

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

Prueba (EURUSD,D1)666666.666666278616

Esta es la función que genera los dígitos significativos innecesarios. No deberían estar ahí.

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

Debe haber algún problema con la función DoubleToString.

Prueba (EURUSD,D1)666666.666666278616

Esta es la función que genera los dígitos significativos innecesarios. No debería haber ninguno.

¿Has llegado a DoubleToString? :) De nuevo, no estoy afirmando nada: el Manual de Referencia dice literalmente lo siguiente:

" Si el valor de los dígitos se encuentra en el rango de 0 a 16, se recuperará la representación de la cadena del número con el número de decimales especificado. Si el valor de los dígitos se encuentra entre -1 y -16, se obtendrá una representación del número en formato científico con el número de decimales especificado. En todos los demás casos, la cadena de números tendrá 8 decimales".

Ha especificado un valor de 30. Según la descripción del Manual de Referencia, el valor de la cadena del número debe tener 8 decimales en este caso.

 
Yedelkin:

¿Tienes a DoubleToString? :) Una vez más, no estoy afirmando nada: el Manual de Referencia dice literalmente lo siguiente:

Tiene un valor de 30. A juzgar por la descripción en el Manual de Referencia, un valor de cadena de un número en este caso debe contener 8 decimales en absoluto.

El Manual también tiene un signo menos en este lugar :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой".
Y la palabra subrayada en la frase es redundante. :)
 
Rosh:
El libro de referencia también tiene un signo menos en este lugar :)

Lo he copiado de aquí: https://www.mql5.com/ru/docs/convert/doubletostring

La frase que he resaltado, "En todos los demás casos, el valor de la cadena del número tendrá 8 decimales" no parece contener un signo menos :/

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64:
Y la palabra subrayada en la frase es redundante. :)
Bueno, han pasado años :)
 

Mi pregunta se perdió.

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

La orden de arresto sigue colgada.