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

 
sergeev :
수업을 사용합니다.

네 맞습니다. 깨닫지 못했다. 한 번 메시지가 표시되면 이미 기억합니다.

이것이 일어난 방법입니다.

 struct Buff { double b[]; };
//---
Buff lbuff[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int i= 2 ,j= 1000 ;
//---
   ArrayResize (lbuff,i);
   ArrayResize (lbuff[ 0 ].b,j);
   ArrayResize (lbuff[ 1 ].b,j);
  }
로쉬 :
CMatrix 클래스에 대한 예제는 오버로딩 작업 섹션을 참조하십시오. 아마도 이것이 귀하에게 적합할 것입니다.
감사합니다, 공부하겠습니다.
 
Rosh :

사실 실수 는 17자리 이하의 유효 숫자로 메모리에 저장됩니다.

차이를 느끼려면 다음 예를 시도하십시오.

설명서의 설명이 수정됩니다.

예, Renat는 위에서 Print() 가 4의 정확도로 double 유형의 데이터를 인쇄하고 점 뒤에 최대 16 자리 십진수가 아닌 데이터를 인쇄한다고 이미 설명했습니다. 이것은 사용자의 관점에서 전체 걸림돌이었습니다.

 
Yedelkin :

예, Renat는 위에서 Print() 가 4의 정확도로 double 유형의 데이터를 인쇄하고 점 뒤에 최대 16 자리 십진수가 아닌 데이터를 인쇄한다고 이미 설명했습니다. 이것은 사용자의 관점에서 전체 걸림돌이었습니다.

아니요, Print()는 %.16G 형식으로 출력합니다. 즉, 점과 16개의 유효 숫자가 있는 숫자를 인쇄하려고 시도합니다. 이 경우 199.99999999999997이라는 숫자가 저장되며 유효숫자 17개(소수점 앞 3자리 + 소수점 뒤 14자리)를 갖는다. 16자리를 표시하려고 하면 반올림이 시작되고 7은 10으로 반올림되고 단위는 더 높은 자리로 이동하고 거기에는 9가 있습니다. 그리고 도미노 원칙이 시작됩니다. 출력 숫자는 200으로 반올림됩니다.

예를 들어보세요.

 void OnStart ()
  {
   double a,b;

   a= 7.0 / 200.0 ;
   b= 7.0 /a;
   Print ( "Print(b)=" ,b);
   Print ( "Print(DoubleToString(b,16))=" , DoubleToString (b, 16 ));
   double epsilon= MathPow ( 10 ,- 13 );
   Print ( "-------- После вычитания " ,epsilon, "---------" );
   b=b-epsilon;
   Print ( "Print(b)=" ,b);
   Print ( "Print(DoubleToString(b,16))=" , DoubleToString (b, 16 ));

   
  }

PrintFormat()을 참조하십시오.

 
Rosh :

아니요, Print()는 %.16G 형식으로 출력합니다. 즉, 점과 16개의 유효 숫자가 있는 숫자를 인쇄하려고 시도합니다. 이 경우 199.99999999999997이라는 숫자가 저장되며 유효숫자 17개(소수점 앞 3자리 + 소수점 뒤 14자리)를 갖는다. 16자리를 표시하려고 하면 반올림이 시작되고 7은 10으로 반올림되고 단위는 더 높은 자리로 이동하고 거기에는 9가 있습니다. 그리고 도미노 원칙이 시작됩니다. 출력 숫자는 200으로 반올림됩니다.

PrintFormat()을 참조하십시오.

이제 저장된 유효 숫자의 수에 중점을 둔 이유가 명확해졌습니다.

... 그러나 실제 숫자 가 17개 이하의 유효 자릿수로 메모리에 저장되어 있는 경우(우리의 경우 숫자 199.99999999999997), 이 변환에서 유효 자릿수는 어디에서 오는 것입니까?

MP 0 Victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))= 199.9999999999997 16

? (19비트 계산)
 

"전투 상황에서 파이의 수는 4에 달할 수 있습니다."

DoubleToString은 인쇄 형식과 약간 다르게 작동합니다(CRT에 따라 다름)

DoubleToString에서 정수 및 소수 부분 은 개별적으로 문자열로 변환되며 표준 형식보다 약간 더 빠른 알고리즘을 사용합니다.

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo :

DoubleToString에서 정수 및 소수 부분 은 개별적으로 문자열로 변환되며 표준 형식보다 약간 더 빠른 알고리즘을 사용합니다.

그러나 17개 이상의 유효 숫자 가 메모리에 저장되어 있음이 밝혀졌습니다. 그렇지 않으면 문자열로의 변환을 위해 정수 및 소수 부분이 어디에서 올까요? 즉, Print() 또는 DoubleToString() 여부에 관계없이 어딘가에서 데이터를 가져옵니다("메모리에 17개의 유효 자릿수 이하" 저장에 대해 이야기하는 경우).

... 물론 '기억에 저장한다'는 말에 푹 빠져 실수를 저장하는 성질을 몰라서 제대로 이해하지 못했을 수도 있다.

 
Yedelkin :

그러나 17개 이상의 유효 숫자 가 메모리에 저장되어 있음이 밝혀졌습니다. 그렇지 않으면 문자열로의 변환을 위해 정수 및 소수 부분이 어디에서 올까요? 즉, Print() 또는 DoubleToString() 여부에 관계없이 어딘가에서 데이터를 가져옵니다("메모리에 17개의 유효 자릿수 이하" 저장에 대해 이야기하는 경우).

... 물론 '기억에 저장한다'는 말에 푹 빠져 실수를 저장하는 성질을 몰라서 제대로 이해하지 못했을 수도 있다.

최대 20개의 유효 숫자가 저장되지만 보장되지는 않습니다. 그리고 일반적으로 정수 부분의 숫자가 클수록 분수 부분 의 정확도가 떨어집니다.

소수점 이하 16자리가 왜 필요한가요? 학문적 관심?

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo :

최대 20개의 유효 숫자가 저장되지만 보장되지는 않습니다. 그리고 일반적으로 정수 부분의 숫자가 클수록 분수 부분 의 정확도가 떨어집니다.

소수점 이하 16자리가 왜 필요한가요? 학문적 관심?

:) 파손된 폰이 재생되지 않도록 배경을 살펴보겠습니다.

여기서 빅터 는 Print() 함수의 동작과 그것이 만들어내는 예상치 못한 값에 대해 질문을 던졌다 .

여기에서 나는 그에게 그 이유를 보여주었다 .

그는 Print() 함수의 잼을 처리하고 싶지 않았기 때문에 ,

나는 Print() 함수 의 설명 이 " 더블 데이터는 점 뒤에 16자리의 정확도로 인쇄됩니다. "라고 자유롭게 지적했습니다. 실제로 Print() 함수는 구체적인 예제를 첨부하여 다소 둥근 데이터를 출력 하는 것으로 나타났습니다.

그 후 열띤 토론이 이어졌고 그 결과 아무도 내 예를 반박할 수 없었고 Renat는 첫 번째 버전의 개요를 설명하고 참고서가 수정될 것이라고 말했습니다 .

며칠 후 Rosch는 17이라는 숫자가 언급된 두 번째 버전 을 발표 했습니다 .

토론에 참여하여 세 번째 버전, 즉 " DoubleToString에서 정수 및 소수 부분은 개별적으로 문자열로 변환되며 표준 형식보다 약간 빠른 알고리즘을 사용합니다. " 즉. 문제는 이미 알고리즘의 속도로 밝혀졌습니다.

그런 다음 일반적으로 Roche의 두 번째 버전에서 저장된 숫자의 크기라는 사실에주의를 기울였습니다.

스트링고 :

소수점 이하 16자리가 왜 필요한가요? 학문적 관심?

이제 우리는 이러한 질문에 답할 수 있습니다. Print() 함수가 반올림된 데이터를 출력하는 경우를 예로 들었습니다. 나는 그런 행동의 이유에 대해 묻지 않았다. 내 예는 반박되지 않았고 단순히 다른 기능을 사용하도록 조언하고 이유를 설명하기 시작했습니다. 이 설명 중 소수점 이하 자릿수 16(17)자리에 대한 언급이 있었습니다. 이 설명에서 모든 것을 이해하지 못했기 때문에 도중에 질문을 했습니다. - 그래서 이것은 나의 학문적 관심도 아니라 그들이 나에게 전달하려고 하는 아이디어를 이해하고자 하는 열망입니다.

 
Yedelkin :

. . . 따라서 이것은 제 학문적 관심이 아니라 단순히 그들이 저에게 전달하려는 아이디어를 이해하고자 하는 열망입니다.

완전히 동의 해. 학문적 관심은 아무 상관이 없습니다.

우리는 문서 " 실수 "를 읽었습니다. IEEE 754 표준, 더블 용 표 – 15개의 유효 숫자. 이를 염두에 두고 유효숫자 15, 16, 17의 4가지 옵션과 정수부와 분수가 별도로 저장되는 옵션이 이미 누적되어 있습니다. 하지만 그런 일은 일어나지 않습니다! 여기서 학문적 관심은 무엇입니까? 그런데 여기에는 오히려이 프로그래밍 언어가 기반으로하는 기본 형식 논리가 있습니다.

프로그래머는 컴파일러를 연구하는 것이 아니라 프로그램을 작성해야 한다고 생각합니다.

추신

저는 이 기회를 통해 다음 사항을 명확히 하고자 합니다.

ArrayResize () 함수를 사용하여 동적 배열의 크기를 늘리면 이전에 그 안에 있던 데이터가 저장되는 것이 보장 됩니까? 아마도 이 점은 문서(ArrayResize() 함수에 대한 설명)에 명확하게 반영되어야 합니다. 아시는 분 계시면 알려주세요.

 
victorg :

ArrayResize () 함수를 사용하여 동적 배열 의 크기를 늘리면 이전에 그 안에 있던 데이터가 저장되는 것이 보장 됩니까? 아마도 이 점은 문서(ArrayResize() 함수에 대한 설명)에 명확하게 반영되어야 합니다. 아시는 분 계시면 알려주세요.

크기를 늘릴 때, 그렇지 않으면 그러한 기능에 의미가 없습니다.