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 (...) 함수는 아름다운 보고서에 필요하며 그 이상은 아닙니다.