정규화이중 역설

 

좋은 오후에요!

도움말의 이 섹션을 아무리 많이 읽어도 모든 것을 이해할 수는 없습니다. 글쎄, 이 소수 부분은 끝에서 어디에서 왔는지 ???

Print()를 사용하여 저널에 인쇄할 때 정규화된 숫자는 예상보다 더 많은 소수 자릿수 를 포함할 수 있습니다. 예를 들어,

    이중 a=76.671; // 소수점 이하 3자리의 정규화된 숫자
Print( "인쇄(76.671)=" ,a); // 그대로 표시
Print( "DoubleToString(a,8)=" ,DoubleToString(a,8)); // 주어진 정밀도로 출력

터미널에서 제공:

DoubleToString(a,8)=76.67100000
인쇄(76.671)=76.67100000000001

 
transcendreamer :

좋은 오후에요!

도움말의 이 섹션을 아무리 많이 읽어도 모든 것을 이해할 수는 없습니다. 글쎄, 이 소수 부분은 끝에서 어디에서 왔는지 ???

Print()를 사용하여 저널에 인쇄할 때 정규화된 숫자는 예상보다 더 많은 소수 자릿수 를 포함할 수 있습니다. 예를 들어,

    이중 a=76.671; // 소수점 이하 3자리의 정규화된 숫자
Print( "인쇄(76.671)=" ,a); // 그대로 표시
Print( "DoubleToString(a,8)=" ,DoubleToString(a,8)); // 주어진 정밀도로 출력

터미널에서 제공:

DoubleToString(a,8)=76.67100000
인쇄(76.671)=76.67100000000001

Double 유형은 정밀도에 제한이 있어 오류가 발생할 수 있습니다.

이 기사를 추천합니다: https://www.mql5.com/en/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED :

Double 유형은 정밀도에 제한이 있어 오류가 발생할 수 있습니다.

이 기사를 추천합니다: https://www.mql5.com/en/articles/1561

추천은 명확합니다, 감사합니다

출력할 때 DoubleToStr을 사용할 수 있습니다.

그러나 이것이 어디에서 왔는지 명확하지 않습니다!

나누기/곱셈을 하면 OK, 분명히 오류가 발생합니다.

하지만 일정하게? 내가 직접 쓴?

처음 에는 이 정밀도가 없는 상수에 반올림을 사용해야 합니다.

그리고 가장 중요한 것은 실제로 이중 변수에 저장된 내용의 신뢰성이 훼손된다는 것입니다!

 

문서 에서 인용

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

예를 들어, 숫자 0.3과 0.7은 컴퓨터에서 무한 분수로 표시되는 반면 숫자 0.25는 정확히 2의 거듭제곱으로 저장됩니다.

 
stringo :

문서 에서 인용

흥미로운...

나는 이미 여기의 요점이 MQL이 아니라 80년대 표준 수준의 더 깊은 어딘가에 있다고 추측합니다.

그러나 여전히 매우 이상합니다 ...

나는 어떤 응용 언어에서도 이것을 본 적이 없다

MQL 언어 자체의 수준에서 몇 가지 해결 방법을 사용하는 것이 합리적일 것입니다.

 

여전히 이것은 꼬리 0000000001이 아래 코드에서 발행되는 이유를 설명하지 않습니다.

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

정규화를 했기 때문에

그러나 숫자에는 여전히 꼬리가 있습니다.

 
transcendreamer :

흥미로운...

나는 이미 여기의 요점이 MQL이 아니라 80년대 표준 수준의 더 깊은 어딘가에 있다고 추측합니다.

그러나 여전히 매우 이상합니다 ...

나는 어떤 응용 언어에서도 이것을 본 적이 없다

MQL 언어 자체의 수준에서 몇 가지 해결 방법을 사용하는 것이 합리적일 것입니다.

이게 뭐가 그렇게 어렵나요?

최대 4자리의 정확도가 필요한 경우. 숫자에 10,000을 곱하고 소수 부분 을 버리고 10,000으로 나눕니다.

mql의 수학 함수는 문서에서 찾을 수 있습니다.

 

text = "포트폴리오의 경우 " + (문자열)현재 + "에서 마감된 포지션: " + 포트폴리오 이름;

여기에서 현재에 대해 DoubleTo String을 수행해야 하며 모든 것이 잘 될 것입니다.

 

예, 반올림을 강제해야 한다는 것을 이미 이해했습니다.

NormalizeDouble 이 작업에 적합하지 않은 것 같습니다.

 
transcendreamer :

예, 반올림을 강제해야 한다는 것을 이미 이해했습니다.

NormalizeDouble이 작업에 적합하지 않은 것 같습니다.

NormalizeDouble은 정확히 이와 같이 작동합니다(그리고 최초의 MQL 이후로 항상 이와 같이 작동했습니다).

숫자에 10을 자릿수의 거듭제곱으로 곱하고 정수 형식으로 변환( 소수 부분 제외)한 다음 10으로 자릿수의 거듭제곱으로 나눕니다.

문제는 무엇입니까? 템플릿 중단?

 
stringo :

NormalizeDouble은 정확히 이와 같이 작동합니다(그리고 최초의 MQL 이후로 항상 이와 같이 작동했습니다).

숫자에 10을 자릿수의 거듭제곱으로 곱하고 정수 형식으로 변환( 소수 부분 제외)한 다음 10으로 자릿수의 거듭제곱으로 나눕니다.

문제는 무엇입니까? 템플릿 중단?

패턴 갭은 정규화 후에도 꼬리가 남아 있다는 것입니다!