Hatalar, hatalar, sorular - sayfa 719

 
ALozovoy :

Profilinize gidin ve Servis Masası'nı seçin


Teşekkür ederim
 
Rosh :

. . . Yazdır işlevi için yeni, daha eksiksiz bir örnek yardıma eklendi:

 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.99999999999997 16 (видим, что на самом деле 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.99999999999985 78
//    (теперь значение b после вычитания эпсилон не может округлиться до 200)
  }

Madem bu konuyla ilgileniyorsunuz, fazladan sayıların nereden geldiğini açıklayabilir misiniz, kırmızı ile işaretlenmişler.

Sadece IEEE 754 için anlamlı basamak sayısının ondalık noktadan sonra değil, toplamda 17'yi geçemeyeceğini düşünürdüm.

 
victorg :

Sadece IEEE 754 için anlamlı basamak sayısının ondalık noktadan sonra değil, toplamda 17'yi geçemeyeceğini düşünürdüm.

Dürüst olmak gerekirse, beni hiç rahatsız etmedi. Ama eğer ilgileniyorsanız, işte birkaç bağlantı:

Bu soruların cevaplarının olacağını garanti etmiyorum, ancak okumak ilginç olabilir.

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 :

Dürüst olmak gerekirse, beni hiç rahatsız etmedi.

Muhtemelen DoubleToString işlevinde bir sorun var.

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

Testi (EURUSD,D1)        666666.66666666662 78616

Gereksiz önemli rakamlar verir. Olmamalılar.

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

Muhtemelen DoubleToString işlevinde bir sorun var.

Testi (EURUSD,D1)        666666.66666666662 78616

Gereksiz önemli rakamlar verir. Olmamalılar.

DoubleToString'e mi ihtiyacınız var? :) Yine, hiçbir şeymiş gibi davranmadan: El Kitabı tam anlamıyla şunları söylüyor:

"Rakamların değeri 0 ile 16 arasındaysa, belirtilen ondalık basamak sayısıyla sayının dize gösterimi elde edilir. Basamakların değeri -1 ile -16 arasındaysa, sayının dize temsili Bilimsel formatta belirtilen sayı ile elde edilecektir ondalık basamak Diğer tüm durumlarda sayı, sayının dize değeri 8 ondalık basamak içerecektir .

Değeriniz 30'dur. El Kitabındaki açıklamaya göre, bu durumda sayının dize değeri genellikle 8 ondalık basamak içermelidir.

 
Yedelkin :

DoubleToString'e mi ihtiyacınız var? :) Yine, hiçbir şeymiş gibi davranmadan: El Kitabı tam anlamıyla şunları söylüyor:

Değeriniz 30'dur. El Kitabındaki açıklamaya göre, bu durumda sayının dize değeri genellikle 8 ondalık basamak içermelidir.

Kılavuzda bu yerde de eksi işareti var :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой ".
Ve cümledeki altı çizili kelime gereksizdir. :)
 
Rosh :
Kılavuzda bu yerde de eksi işareti var :)

Buradan kopyaladım: https://www.mql5.com/ru/docs/convert/doubletostring

"Diğer tüm durumlarda, sayının dize değeri 8 ondalık basamak içerecek" ifadesini vurguladım, eksi işareti içermiyor gibi görünüyor :/

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64 :
Ve cümledeki altı çizili kelime gereksizdir. :)
Pekala, aradan yüz yıl geçti :)
 

benim sorum kayboldu

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

Sipariş hala duruyor.