Errori, bug, domande - pagina 719

 
ALozovoy:

Vai al tuo profilo e seleziona Service Desk


Grazie
 
Rosh:

. è stato aggiunto all'aiuto un nuovo esempio più completo per la funzione Print:

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

Visto che ti sei occupato di questo problema, potresti spiegare da dove vengono le cifre extra, che sono segnate in rosso.

Ho appena pensato in precedenza che per IEEE 754 il numero di cifre significative non può superare 17, e non dopo il punto decimale, ma tutti.

 
victorg:

Pensavo solo che per IEEE 754 il numero di cifre significative non può superare 17, e non il punto decimale, ma il totale.

Onestamente, non mi ha mai dato fastidio. Ma ecco un paio di link se siete interessati:

Non garantisco che ci saranno risposte a queste domande, ma potrebbero essere interessanti da leggere.

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:

Onestamente, non mi ha mai dato fastidio.

Ci deve essere qualcosa di sbagliato nella funzione DoubleToString.

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

Test (EURUSD,D1)666666.6666666666278616

Questa è la funzione che genera le cifre significative non necessarie. Non dovrebbero essere lì.

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

Ci deve essere qualcosa di sbagliato nella funzione DoubleToString.

Test (EURUSD,D1)666666.6666666666278616

Questa è la funzione che genera le cifre significative non necessarie. Non dovrebbero essercene.

Sei arrivato a DoubleToString? :) Di nuovo, non pretendo nulla: il manuale dice letteralmente quanto segue:

"Se il valore delle cifre si trova nell'intervallo da 0 a 16, la rappresentazione della stringa del numero sarà recuperata con il numero specificato di posizioni decimali. Se il valore delle cifre è compreso tra -1 e -16, allora si otterrà una rappresentazione stringa del numero in formato scientifico con il numero di posizioni decimali specificato. In tutti gli altri casi, la stringa di numeri avrà 8 cifre decimali".

Avete specificato un valore di 30. Secondo la descrizione nel Manuale di riferimento, il valore della stringa del numero dovrebbe avere 8 cifre decimali in questo caso.

 
Yedelkin:

Hai raggiunto DoubleToString? :) Di nuovo, non pretendo nulla: il manuale di riferimento dice letteralmente quanto segue:

Avete un valore di 30. A giudicare dalla descrizione nel Manuale di riferimento, un valore stringa di un numero in questo caso dovrebbe contenere 8 cifre decimali.

Il manuale ha anche un segno meno in questo posto :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой".
E la parola sottolineata nella frase è ridondante. :)
 
Rosh:
Il libro di riferimento ha anche un segno meno in questo posto :)

L'ho copiato da qui: https://www.mql5.com/ru/docs/convert/doubletostring

La frase che ho evidenziato, "In tutti gli altri casi, il valore della stringa del numero avrà 8 cifre decimali" non sembra contenere un segno meno :/

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64:
E la parola sottolineata nella frase è ridondante. :)
Beh, sono passati secoli :)
 

La mia domanda si è persa.

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

Il mandato è ancora in sospeso.