오류, 버그, 질문 - 페이지 719

 
ALozovoy :

프로필로 이동하여 서비스 데스크를 선택하십시오.


고맙습니다
 
Rosh :

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

이 문제를 다루었으므로 추가 숫자가 어디에서 왔는지 설명할 수 있습니까? 해당 숫자는 빨간색으로 표시됩니다.

IEEE 754의 경우 유효 자릿수는 소수점 이하가 아니라 합계 17을 초과할 수 없다고 생각했습니다.

 
victorg :

IEEE 754의 경우 유효 자릿수는 소수점 이하가 아니라 합계 17을 초과할 수 없다고 생각했습니다.

솔직히 말해서, 그것은 나를 귀찮게 한 적이 없습니다. 그러나 관심이 있는 경우 다음과 같은 몇 가지 링크가 있습니다.

이러한 질문에 대한 답이 있을 것이라고 보장하지는 않지만 흥미롭게 읽을 수 있습니다.

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 :

솔직히 말해서, 그것은 나를 귀찮게 한 적이 없습니다.

DoubleToString 함수 에 문제가 있는 것 같습니다.

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

테스트(EURUSD,D1)        666666.66666666662 78616

불필요한 유효 숫자를 제공합니다. 그들은 안된다.

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

DoubleToString 함수 에 문제가 있는 것 같습니다.

테스트(EURUSD,D1)        666666.66666666662 78616

불필요한 유효 숫자를 제공합니다. 그들은 안된다.

DoubleToString에 있습니까? :) 다시 말하지만, 아무 척하지 않고 핸드북은 말 그대로 다음과 같이 말합니다.

"숫자의 값이 0과 16 사이이면 지정된 소수점 이하 자릿수를 가진 숫자의 문자열 표현이 얻어집니다. 숫자의 값이 -1과 -16 사이이면 숫자의 문자열 표현 과학적 형식은 지정된 소수점 이하 자릿수로 얻어집니다. 다른 모든 경우 number, 숫자의 문자열 값에는 소수점 이하 8자리 "가 포함됩니다 .

귀하의 값은 30입니다. 핸드북의 설명에 따르면 이 경우 숫자의 문자열 값은 일반적으로 소수점 이하 8 자리를 포함해야 합니다.

 
Yedelkin :

DoubleToString에 있습니까? :) 다시 말하지만, 아무 척하지 않고 핸드북은 말 그대로 다음과 같이 말합니다.

귀하의 값은 30입니다. 핸드북의 설명으로 판단하면 이 경우 숫자의 문자열 값은 일반적으로 소수점 이하 8 자리를 포함해야 합니다.

설명서에는 이 자리에도 빼기 기호가 있어요 :)
 
Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой ".
그리고 문장에서 밑줄 친 단어는 불필요합니다. :)
 
Rosh :
설명서에는 이 자리에도 빼기 기호가 있어요 :)

여기에서 복사했습니다: https://www.mql5.com/ru/docs/convert/doubletostring

"다른 모든 경우에 숫자의 문자열 값은 소수점 이하 8자리를 포함합니다"라고 강조한 문구에는 빼기 기호가 포함되어 있지 않은 것 같습니다./

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
Преобразование данных / DoubleToString - Документация по MQL5
 
tol64 :
그리고 문장에서 밑줄 친 단어는 불필요합니다. :)
글쎄, 그것은 백년이 흘렀다 :)
 

내 질문이 사라졌습니다

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

주문은 여전히 유효합니다.

사유: