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

[삭제]  
VBAG :
...
Irtron 이 제안한 코드의 아름다움은 간결함입니다(더 이상 아무것도 아닙니다. 변수를 절약하는 것까지!)
...


여기서 Irtron 이 제안한 방법을 살펴보았습니다.

int ComparePrice(double a, double b, double digit)
{
     a -= b;
     b = digit;
     if (a > b)
         return (1);
     if (a < -b)
         return (-1);
     return (0);
 }

저보다 컴팩트하고 빠르지만, 비교에 2개의 이중변수가 포함되어 있어서 얼핏 보기에도 의심스럽습니다!!!!

이 방식에서는 숫자 만 상수 역할을 하여 비교할 수 있으며, 비교 대상인 변수 a 도 정규화되지 않은 double 이므로 그대로 유지됩니다!
이것이 의심을 불러일으키는가? (상수란 일반적인 상수인 "#define"과 작업에 참여하지 않은 변수를 의미합니다.

또한 다른 스레드에서는 개발자 자신이 이중 상수도 비교하지 않는 것이 좋습니다 !!!
그리고 NormalizeDouble (a) !OC를 하는 것도 옳지 않습니다! NormalizeDouble(b), !OC! - 비교 연산자!

게다가, 원래 버전에서는 상수 자릿수 대신 다음과 같았습니다. b = Point / 2 - 두 개의 비정규화 변수 중 두 개가 이미 있습니까?

이 옵션이 독창적이라고 믿고 싶지만 먼저 의심을 없애십시오!

누군가 내 버전에서 오류를 찾을 수 있습니까?
 
gravity001 :

여기서 Irtron 이 제안한 방법을 살펴보았습니다.

int ComparePrice(double a, double b, double digit)
{
     a -= b;
     b = digit;
     if (a > b)
         return (1);
     if (a < -b)
         return (-1);
     return (0);
 }
다른 방법을 제안했습니다.
잘 봐주세요.


게다가, 원래 버전에서는 상수 자릿수 대신 다음과 같았습니다. b = Point / 2 - 두 개의 비정규화 변수 중 두 개가 이미 있습니까?

어떤 옵션에 대해 이야기하고 있습니까?

이미 정규화에 대해 이야기했습니다. 먼저, 왜 그것을 사용해야 하는지, 그리고 나서 서야 어떻게 그리고 어디에서 말하세요.

예를 들어, 위의 논의에서 일종의 성취로 언급된 정확히 소수점 14자리와 가격을 비교하는 이유를 알고 있습니까? :) 제가 제안한 함수는 ComparePrice라고 합니다. :)
[삭제]  

Irtron писал (а):
...
다른 방법을 제안했습니다.
잘 봐주세요.
...

어떤 옵션에 대해 이야기하고 있습니까?

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

예를 들어, 위의 논의에서 일종의 성취로 언급된 정확히 소수점 14자리와 가격을 비교하는 이유를 알고 있습니까? :) 제가 제안한 함수는 ComparePrice라고 합니다. :)
여기, 당신 것입니까? 내가 올바르게 인용하고 있습니까?
Irtron 10.09.2007 04:07

...

int ComparePrice(더블, 더블 b)
{
a -= b;
b = 포인트 / 2.;
만약 (a > b)
반환(1);
만약 (a < -b)
리턴(-1);
리턴(0);
}
...
제가 제안한 함수가 ComparePrice라는 것을 상기시켜 드리겠습니다. :)

눈치채셨겠지만, ComparePrice라는 함수도 인용했습니다. 당신의 것이 이미 VBAG에 의해 수정되었을 뿐입니다. 그렇기 때문에 원본을 염두에 두고 원본 버전에 대해 썼습니다. 당신의 기능!
두 기능을 직접 테스트했습니다. 예, 그들은 더 빨랐습니다. 그러나 비교의 신뢰성을 확인하는 방법은 무엇입니까? 두 개의 이중 변수를 비교하여 매우 혼란스럽습니까? 간격을 취하기 때문에 모든 것이 정확해야 하지만! 그러나 여전히 항상 올바르게 작동하지 않을 것이라는 의혹이 있습니다!

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

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

더블 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 :

또한 다른 스레드에서는 개발자 자신이 이중 상수도 비교하지 않는 것이 좋습니다 !!!
이것은 나를 위한 소식이다! 무엇이라고 불리는가 - 질문은 본질적으로!
가능하시면 링크 부탁드립니다!

개발자에게 질문이 있습니다.

상수를 사용하여 복식을 비교할 때 제한 사항이나 가능한 문제가 무엇인지 설명하십시오.
하나.
이중 a=1.23456789;
더블 b;

if(a>b) 또는 if(a<b)

그리고 이 형식에서:
2.
#1.23456789를 정의합니다.

더블 b;

if(a>b) 또는 if(a<b)
 
gravity001 :

게다가, 원래 버전에서는 상수 자릿수 대신 다음과 같았습니다. b = Point / 2 - 두 개의 비정규화 변수 중 두 개가 이미 있습니까?

이러한 이유로 표현식 b = Point / 2 를 상수로 대체했습니다(1. 더 적은 작업 - 더 빠른 속도 2. 상수의 명시적 전송 - 더 높은 신뢰성)

그러나 이중 상수 비교의 비신뢰성에 대한 귀하의 진술에 비추어 볼 때 요점은 손실됩니다. 우리는 이 문제를 더 잘 이해할 필요가 있습니다.

개발자들의 의견이 궁금합니다.
[삭제]  
VBAG писал (а):
...
이것은 나를 위한 소식이다! 무엇이라고 불리는가 - 질문은 본질적으로!
가능하시면 링크 부탁드립니다!
...
예, 링크를 찾고 있었는데 바로 삽입하고 싶었지만 찾지 못했습니다! 어디선가 본 기억이 나는데 그런 주제가 너무 많았다. 나는 또한 다른 포럼에서 많은 주제를 읽었고 이 주제에 관한 책에서도 읽었습니다.
나는 누군가가 쓴 곳을 기억하지만 어디에서 (((((. 따라서 내가 쓰는 것이 올바르지 않을 수 있습니다 : "다른 스레드에서 개발자가 작성했습니다"!
죄송합니다.
그러나 찾으면 링크를 게시하겠습니다.

나는 이것을 C++ 책에서 읽은 것 같다. 거기에는 실수를 비교하는 방법이 설명되어 있고 정수로 가는 것이 가장 좋다고 쓰여 있습니다!
 
gravity001 :
VBAG는 다음과 같이 썼습니다.
...
이것은 나를 위한 소식이다! 무엇이라고 불리는가 - 질문은 본질적으로!
가능하시면 링크 부탁드립니다!
...
예, 링크를 찾고 있었는데 바로 삽입하고 싶었지만 찾지 못했습니다! 어디선가 본 기억이 나는데 그런 주제가 너무 많았다. 나는 또한 다른 포럼에서 많은 주제를 읽었고 이 주제에 관한 책에서도 읽었습니다.
나는 누군가가 쓴 곳을 기억하지만 어디에서 (((((. 따라서 다음과 같이 쓰는 것이 옳지 않을 수 있습니다 : "다른 분기에서 개발자가 작성했습니다"!
죄송합니다.
그러나 찾으면 링크를 게시하겠습니다.

나는 이것을 C++ 책에서 읽은 것 같다. 거기에는 실수를 비교하는 방법이 설명되어 있고 정수로 가는 것이 가장 좋다고 쓰여 있습니다!
여러분의 참여와 도움에 감사드립니다. 불행히도 나는 프로그래밍 분야에 대한 학문적 지식이 없습니다. 그러므로 더 많이 듣고 기억해야 합니다. 그리고 개발자들이 내 질문에 답하고 명확히 해주기를 바랍니다.
개발자에게 질문이 있습니다.

상수를 사용하여 복식을 비교할 때 제한 사항이나 가능한 문제가 무엇인지 설명하십시오.
하나.
이중 a=1.23456789;
더블 b;

if(a>b) 또는 if(a<b)

그리고 이 형식에서:
2.
#1.23456789를 정의합니다.

더블 b;

if(a>b) 또는 if(a<b)
 
이러한 문제는 1.3333+0.0004 != 1.3337입니다.
 

이 대화는 영원히 계속될 것 같습니다. 새로운 사용자가 적절한 경험과 지식을 얻을 때까지 그는 일반적으로 정규화에 여러 번 걸려 넘어집니다.

아마도 MT5에서는 비교 연산을 수행할 때 실수의 정확도를 소수 8자리로 강제로 제한하는 것이 합리적입니다(예: digit=8로 NormalizeDouble ()을 강제 실행). 그리고 NormalizeDouble() 함수가 명시적으로 지정된 경우에만 해당 함수에 지정된 매개변수에 따라 정규화를 수행합니다. 이 경우 사용자가 정확히 지정된 정확도가 필요한 경우에만 질문이 훨씬 덜 자주 발생합니다. 제 생각에는 이 양 고추 냉이가 조금 있지만 여전히 무 보다 더 달콤합니다.

[삭제]  
VBAG :
안녕하세요!
아시다시피 계산의 정확성뿐만 아니라 작성된 코드의 신뢰성도 프로그래밍 스타일과 코드의 정확성에 따라 달라집니다.
우리는 장난감을 쓰는 것이 아니므로 작성된 프로그램의 신뢰성이 첫 번째 요구 사항입니다. 대부분의 계산은 복식으로 이루어지며 정확한 비교는 코드에 있습니다.
두 개의 실수로 구성된 프로그램에는 특정 접근 방식과 정확성이 필요합니다.
"올바른" 프로그래밍 스타일을 찾으려고 합니다. 따라서 질문:

표현을 위해

이중;
더블 b;

if(a==b) 또는 if(a!=b)
{.......} {.... ..}

개발자 추천
//+----------------------------------------------- --------------------+
//| 두 실수를 비교하는 함수. |
//+----------------------------------------------- --------------------+
bool CompareDouble(이중 숫자1, 이중 숫자2)
{
bool 비교 = NormalizeDouble(숫자1 - 숫자2, 8) == 0;
반환(비교);
}
//+----------------------------------------------- --------------------+


코드가 맞습니까?

이중;
더블 b;

if(a>b) if(a<b)
{.......} {.......}


일반적인 경우에는 그렇지 않을 가능성이 큽니다. 어떤 올바른 검증 방법을 선택해야 합니까?
복식으로 작업하는 가장 좋은 스타일은 무엇입니까?
답변해 주시는 모든 분들께 미리 감사드립니다.

잘 보상받았습니다... :)

부동 소수점 비교 - 차이 계수를 작은 임계값과 비교하여 수행됩니다.

예를 들어 (fabs(d1-d2) < 1e-10)을 반환합니다.

왜 물 이 흐려지는가... NormalizeDouble (...) 함수는 아름다운 보고서에 필요하며 그 이상은 아닙니다.