. . . Yazdır işlevi için yeni, daha eksiksiz bir örnek yardıma eklendi:
voidOnStart ()
{
//--- выведем 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//--- посмотрим как выводится тип floatfloat 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 - но это не так//--- выведем вновь вычисленное значение bPrint ( "----- после арифметических операций" );
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-013double 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.
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...
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.
Profilinize gidin ve Servis Masası'nı seçin
. . . Yazdır işlevi için yeni, daha eksiksiz bir örnek yardıma eklendi:
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.
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.
Dürüst olmak gerekirse, beni hiç rahatsız etmedi.
Muhtemelen DoubleToString işlevinde bir sorun var.
Testi (EURUSD,D1) 666666.66666666662 78616
Gereksiz önemli rakamlar verir. Olmamalılar.
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.
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 :)
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 :/
Ve cümledeki altı çizili kelime gereksizdir. :)
benim sorum kayboldu
https://www.mql5.com/ru/forum/1111/page721#comment_179003
Sipariş hala duruyor.