MQL4 마스터에 대한 질문입니다. 다시 Double Compare에 대해. - 페이지 8

 
SK. писал (а):
VBAG :
글쎄, 나는 당신에게서 그것을 기대하지 않았습니다.

나는 내 말을 되돌린다.
내 의심이 틀렸다니 다행이다.
 

SK로

네가 더 잘 알 잖아. 나는 MQL을 프로그래밍 언어라고 생각하지 않는다. 딱 그런 사투리.

그건 그렇고, zadolbali 두 가지가 있습니다.

1) 연산의 열거가 없습니다. 즉, 반드시 중괄호여야 합니다.

2) return - 괄호의 필요성이 매우 짜증납니다.

그리고 일반적으로 - 잘한 사람들.

Kernighan과 Ritchie는 그들에게 박수를 보낼 것입니다.

 
VBAG писал (а):
나는 내 말을 되돌린다.
내 의심이 틀렸다니 다행이다.


그리고 우리는 싸우지 않았습니다 :)

데피 :

나는 MQL을 프로그래밍 언어라고 생각하지 않는다. 딱 그런 사투리.

아마도 용어의 문제일 것입니다. 예를 들어 MQL에서 본격적인 언어의 모든 표시를 찾습니다. 어떤 식 으로든 이것은 거래자에게 활동을 기계화하고 자동화 할 수있는 기회를 제공하는 몇 안되는 언어 중 하나입니다. 이 언어는 적어도 그 기능이 대부분의 알고리즘의 요구 사항과 반복적으로 중복된다는 점에서 상당히 만족스러운 것 같습니다(즉, 실행 가능한 아이디어는 충분하지만 구현 수단은 이미 사용 가능함).
 
SK. писал (а):
...

그리고 현 상황에서 변수 123.00000000000이 계산에 사용되는 시점에서 초기값은 122.999999999999로 판명될 수 있다. 그리고 이것은 변수가 발견된 이후로 그 값이 변경되지 않았음에도 불구하고 프로그램에서 다른 계산에 참여하도록 요청했을 뿐입니다.


사실, 그것이 모든 소란을 일으키는 이유입니다. 그렇기 때문에 NormalizeDouble ()을 실제 계산에 최대한 가깝게, 가급적이면 if, for, while 문의 조건에서 바로 사용해야 합니다.

당신은 당신의 말에 자신 있습니까? 가능하다면 지식의 출처를 표시하십시오.

그럼 당신에게 질문이 있습니다

하나? 문제가 변수를 저장하거나 읽는 것이라면 반환된 값도 기억되거나 오류와 함께 읽는 경우 NormalizeDouble()이 어떻게 도움이 될 수 있습니까?
2? NormalizeDouble(값, 숫자) 체계가 왜 !OC입니까! NormalizeDouble(값, 숫자) 여기서 !OS! - 비교 연산자가 항상 작동하지 않습니까? if에 직접 삽입되어도?
삼? NormalizeDouble()(함수 알고리즘)이 어떻게 작동하는지 알고 있습니까?
4? 이 문제에 대해 내 의견을 썼습니다. 어떻게 생각하세요?

중력001은 다음과 같이 썼습니다.

...
이미 정규화에 대해 이야기했습니다. 먼저, 그것을 사용하는 이유 를 알려주고 그 다음에야 어떻게 그리고 어디서 .

그게 핵심 질문이죠, 그렇죠? 나는 오랫동안 이것에 대해 생각했습니다. "당신은 더블을 입력하고 당신은 더블 을 얻습니다. " . 무엇이 바뀔 수 있습니까?
정확한 답을 찾지 못했습니다. 하지만 나는 이렇게 상상한다.

더블 a = 2.000000000000
더블 b = 2.000000000001
더블 c = 1.999999999999

이 변수들은 모두 다르며 메모리에 마지막 문자(숫자)까지 저장됩니다!
이 경우 우리는 기호 (숫자)를 스스로 결정합니다. 정의되지 않은 모든 것은 0으로 채워집니다.

double a = 2.0으로 설정하고 메모리에서 이미 2.0000001 또는 1.9999999로 기억된 경우 NormalizeDouble()은 이미 부정확한 값을 반환하므로 도움이 되지 않을 것이 분명합니다!
변수의 값을 기억할 때 그런 실수는 거의 일어나지 않는다고 생각합니다. 게다가, 나는 숫자 2.0이 1.9999999999999로 특별히 기억된다고 생각하지 않습니다. 왜냐하면 각 문자(숫자 또는 점)에 대해 메모리의 비트 문자열에서 특정 비트가 응답될 것이기 때문입니다! 따라서 숫자 2.0은 2.00000...00으로 안전하게 저장됩니다.

기호를 스스로 정의하지 않는 또 다른 경우:

a = 4.0;
b = 2.0;
c = a / b // - "나누기" 작업은 프로세서 또는 보조 프로세서에서 수행되며 변수도 문자(숫자)로 채웁니다.

수술 후 다음과 같은 증상이 나타날 수 있습니다.
자주:
c = 2.000...0
c= 1.99999999...
c= 2.00000001...

저것들. 결과는 종종 실제와 약간의 차이가 있습니다.

큰 실수는 매우 드뭅니다.
c = 2.3

여기에 두 가지 설명이 있습니다.
1) 또는 b가 호출될 때 메모리에서 비트 문자열의 일부가 손상되었습니다. 변수와 b가 변경되었습니다.
2) "나누기" 작업 중 오류가 발생했습니다.

가장 자주 일어나는 일은 2)라고 생각합니다. 왜 나는 모른다. 나는 이것이 그들이 필요에 따라 보조 프로세서의 작업을 최적화하려고 시도하기 때문이라고 생각합니다.

변수 c를 숫자 2.000...00과 비교할 때 평등이 충족되지 않을 것이 분명합니다. 모든 비트가 일치하는 것은 아니기 때문입니다.

이제 NormalizeDouble()이 도와드리겠습니다!
NormalizeDouble()은 이 작은 버그를 "수정"합니다!
오류는 일반적으로 매우 작기 때문에 작은 정밀도로 반올림하면 항상 올바른 결과를 얻을 수 있습니다.

다음과 같이 표시됩니다.
숫자 a = 2.111...11을 소수점 둘째 자리로 반올림합시다.
이를 위해 NormalizeDouble()은 먼저 새 변수에 2.11을 쓰고 나머지 비트를 1이 아닌 0으로 채웁니다!
나는 그것이 다음과 같이 보일 것이라고 생각한다.

double MyNormalizeDouble(double value, int digits)
{
     int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                       с помощью которого мы из VALUE сделаем целое число
     double result = MathRound(factor * value) / factor;
     return(result);
}
여기서는 NormalizeDouble()이 필요한 이유를 최대한 설명하려고 했습니다.

최근까지 이 설명은 나에게 완전히 맞았습니다. 그러나 최근에 나는 그러한 계획이 항상 효과가 있는 것은 아님을 스스로 보았다.

NormalizeDouble(a, 2) !OC! NormalizeDouble(b, 2), 여기서 !OC! 비교 연산자입니다.
내 의견으로는 항상 작동해야하지만!
그러므로 나는 합리적이고 이해할 수있는 비판에 기뻐할 것입니다!
 
gravity001 :
SK. (a)는 다음과 같이 썼다.
...

그리고 현 상황에서 변수 123.00000000000이 계산에 사용되는 시점에서 초기값은 122.999999999999로 판명될 수 있다. 그리고 이것은 변수가 발견된 이후로 그 값이 변경되지 않았음에도 불구하고 프로그램에서 다른 계산에 참여하도록 요청했을 뿐입니다.

사실, 그것이 모든 소란을 일으키는 이유입니다. 그렇기 때문에 NormalizeDouble ()을 실제 계산에 최대한 가깝게, 가급적이면 if, for, while 문의 조건에서 바로 사용해야 합니다.

당신은 당신의 말에 자신 있습니까? 가능하다면 지식의 출처를 표시하십시오.
확신하는. 지식의 원천은 MQL4 프로그래밍과 개발자 상담에 대한 제 자신의 경험입니다.
하나? 문제가 변수를 저장하거나 읽는 것이라면 반환 값도 기억되거나 오류와 함께 읽는 경우 NormalizeDouble()이 어떻게 도움이 될 수 있습니까?
NormalizeDouble()은 비교 작업 직전에 사용해야 합니다. 비교 연산의 결과는 결코 손상되지 않는 부울 유형의 값입니다.
2? NormalizeDouble(값, 숫자) 체계가 왜 !OC입니까! NormalizeDouble(값, 숫자) 여기서 !OS! - 비교 연산자가 항상 작동하지 않습니까? if에 직접 삽입되어도?
나는 그런 말을 하지 않았다. 그것이 정확히 작동하는 방식이며, 그렇게 해야 합니다.
삼? NormalizeDouble()(함수 알고리즘)이 어떻게 작동하는지 알고 있습니까?
아니, 난 몰라. 이것으로 개발자들에게.
4? 이 문제에 대해 내 의견을 썼습니다. 어떻게 생각하세요?
귀하의 의견은 흥미롭지만 이 문제는 오랫동안 해결되었습니다. 개발자의 권장 사항을 사용하고 바퀴를 재발 명하지 않는 것이 좋습니다.
 
SK. писал (а):
중력001 :

2? NormalizeDouble(값, 숫자) 체계가 왜 !OC입니까! NormalizeDouble(값, 숫자) 여기서 !OS! - 비교 연산자가 항상 작동하지 않습니까? if에 직접 삽입되어도?
나는 그런 말을 하지 않았다. 그것이 정확히 작동하는 방식이며, 그렇게 해야 합니다.

다음은 주제에 대한 몇 가지 추가 의견입니다.

'그리고 다시 두 배를 비교하는 것에 대해' , 첫 번째 게시물에서 1 페이지!

정수 24.12.2006 15:23

불행히도 NormalizeDouble(xy,Digits) 구성은 NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) 구성과 동일하지 않습니다.

레나트 24.12.2006 16:15

그리고 반드시 동일할 필요는 없습니다. 먼저 정정합니다.

나는 디자인을 생각한다
if (NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
그리고 디자인
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
똑같다!

무슨 말을 합니까?
 
gravity001 :

레나트 24.12.2006 16:15

그리고 반드시 같을 필요는 없습니다. 먼저 정정합니다.

나는 디자인을 생각한다
if ( NormalizeDouble (x, 자릿수) - NormalizeDouble(y, 자릿수) != 0)
그리고 디자인
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
똑같다!

무슨 말을 합니까?


레나트의 의견은..? 관심이 없다??? MT개발회사 대표이사님의 의견이 궁금하지 않으신가요?

아니면 A.S.의 그 노파와 같습니까? 푸쉬킨? 난 그냥 원해, 원해, 원해! 동화가 어떻게 끝났는지 기억하십시오. "물고기는 아무 말도 하지 않았다. 꼬리를 흔들며 푸른 바다로 헤엄쳐 갔다. 그는 바다에서 오랫동안 대답을 기다렸다. 그는 기다리지 않고 노파에게로 돌아왔다.."

 
SK. писал (а):
중력001 :


레나트 24.12.2006 16:15

그리고 반드시 동일할 필요는 없습니다. 먼저 정정합니다.

나는 디자인을 생각한다
if ( NormalizeDouble (x, 자릿수) - NormalizeDouble(y, 자릿수) != 0)
그리고 디자인
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
똑같다!

무슨 말을 합니까?



레나트의 의견은..? 관심이 없다??? MT개발회사 대표이사님의 의견이 궁금하지 않으신가요?


아니면 A.S.의 그 노파와 같습니까? 푸쉬킨? 난 그냥 원해, 원해, 원해! 동화가 어떻게 끝났는지 기억하십시오. "물고기는 아무 말도 하지 않았다. 꼬리를 흔들며 푸른 바다로 헤엄쳐 갔다. 바다에서 한참을 대답을 기다렸다. 기다리지 않고 노파에게로 돌아왔다.."



그래서 레나트는 첫 번째 선택지가 맞고 두 번째 선택지가 틀리다고 했고, 두 번째 선택지도 맞다고 하셨죠?

2? NormalizeDouble(값, 숫자) 체계가 왜 !OC입니까! NormalizeDouble(값, 숫자) 여기서 !OS! - 비교 연산자가 항상 작동하지 않습니까? if에 직접 삽입되어도?
나는 그런 말을 하지 않았다. 그것이 정확히 작동하는 방식이며, 그렇게 해야 합니다.
 

나는 이것을 말하면서 더 많은 것을 비교하는 것을 의미합니다.

 if ( NormalizeDouble ( x , Digits ) > NormalizeDouble ( y , Digits ))

형식의 구성이 항상 작동하는 것은 아니라는 점을 염두에 두십시오.

 double a = NormalizeDouble ( x , Digits ) ;
double b = NormalizeDouble ( y , Digits ) ;
 
if ( a > b )
  {
  ...
  }

저것들. NormalizeDouble ()은 비교 작업이 평가되는 위치에 최대한 가깝게 연산자 헤더에 직접 삽입해야 합니다.

개발자의 의견에 관해서는 이 의견에 이의를 제기할 생각이 없습니다.

그리고 .. 그 스레드에서 그것은 완전히 다른 디자인에 관한 것이었습니다.

 
SK. писал (а):

나는 이것을 말하면서 더 많은 것을 비교하는 것을 의미합니다.

 if ( NormalizeDouble ( x , Digits ) > NormalizeDouble ( y , Digits ))
이 구성을 다소 확인하지는 않았지만 평등을 확인했습니다.
이 구성을 사용할 때 비교 오류가 발생했습니다.

 if ( NormalizeDouble ( x , digits ) == NormalizeDouble ( y , digits ))
{
    ...
}
왜 몰라?