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

 
Igor Makanu :

정규화는 반올림이 아닙니다.

5 플러스에서 나는 더블 등으로 작업하는 방법에 대한 이론을 알고 있습니다. NormalizeDouble 알고리즘에 버그가 있습니다. 제기된 주제는 복식의 비교와 간접적으로만 관련됩니다.

 
fxsaber :

내 질문을 반복합니다.

그림은 비정규화 변수 n과 정규화 m의 값과 그 차이를 보여줍니다. 그러나 가죽 끈을 비교하고 싶다면 이것이 당신의 선호도입니다.

fxsaber :

5 플러스에서 나는 더블 등으로 작업하는 방법에 대한 이론을 알고 있습니다. NormalizeDouble 알고리즘에 버그가 있습니다. 제기된 주제는 복식의 비교와 간접적으로만 관련됩니다.

여기서 Semko의 설명은 절대 빼놓을 수 없습니다.
 
NormalizeDouble 은 단순히 이중 숫자에 적용되는 특정 알고리즘입니다. 불행히도 오류가 포함되어 있습니다. 수정하면 오류가 사라집니다. 이 이중 표현에서 다른 모든 사람들은 어떤 식으로든 변경되지 않습니다.
 
fxsaber :

NormalizeDouble 알고리즘에 버그가 있습니다.

A100이 그것에 대해 쓴 것 같습니다

그러나 개발자는 MQL의 출현 이후로 이 "기능"을 고수해 왔습니다.


fxsaber :
수정하면 오류가 사라집니다.
다른 버그가 있을 거라 생각하고 노이즈가 많이 생길 것 같아요))))
 
Igor Makanu :

다른 버그가 있을 거라 생각하고 노이즈가 많이 생길 것 같아요))))

그들은 나타나지 않을 것입니다, 왜냐하면 거의 모든 사람들이 정규화를 통해 정규화 된 두 배를 비교합니다. 저것들. 아무데나 두십시오.


이 조건에서 적절한 정규화는 항상 true로 평가되어야 합니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2020.08.10 11:37

   Print (( double )( string )Norm == Norm);     // false

이것은 올바른 정규화를 위한 유일한 검사입니다. 항상 true를 반환하면 아무 것도 깨질 수 없습니다.

 
fxsaber :
NormalizeDouble은 단순히 이중 숫자에 적용되는 특정 알고리즘입니다. 불행히도 오류가 포함되어 있습니다. 수정하면 오류가 사라집니다. 이 이중 표현에서 다른 모든 사람들은 어떤 식으로든 변경되지 않습니다.
예, 여기서 요점은 함수에 있는 것이 아니라 상수가 컴파일러에 의해 정규화되지 않는다는 사실에 있는 것 같습니다(그래야 하지만).
string을 double로 변환할 때도 마찬가지입니다.
 
Alexey Navoykov :
예, 여기서 요점은 함수에 있는 것이 아니라 상수가 컴파일러에 의해 정규화되지 않는다는 사실에 있는 것 같습니다(그래야 하지만).
string을 double로 변환할 때도 마찬가지입니다.

그러면 DLL과 MQL의 동일한 상수가 일치하지 않습니다.

 
fxsaber :

그러면 DLL과 MQL의 동일한 상수가 일치하지 않습니다.

그것은 진실이기도 하다. 게다가, 모든 정규화는 정확도의 손실 이므로 아마도 상수의 정규화에 흥분했을 것입니다.
일반적으로이 문제에는 명확한 해결책이 없습니다. 사실 이것은 그런 문제가 아니지만.
 
Alexey Navoykov :
그것은 진실이기도 하다. 게다가, 모든 정규화는 정확도의 손실 이므로 아마도 상수의 정규화에 흥분했을 것입니다.
일반적으로이 문제에는 명확한 해결책이 없습니다. 사실 이것은 그런 문제가 아니지만.

현재 정규화 알고리즘을 조정하면 됩니다.

 
fxsaber :

현재 정규화 알고리즘을 조정하면 됩니다.

 void OnStart () {
   double d1= 1.79435 ;
   double d2= NormalizeDouble ( 1.79435 , 5 );
   Print (d1==d2);
   Print (is_equal(d1,d2, _Point / 2 ));
}
//+------------------------------------------------------------------+
bool is_equal( double d1, double d2, double e= 0.000000001 ) { return fabs (d1-d2)<e;}

이것이 알고리즘 오류인지도 모르겠습니다.
사실, 당신은 두 배를 비교할 수 없습니다. 그냥 어려운 규칙입니다.
또는 Slava가 말했듯이 엡실론이나 곱셈(예: 1 / _Point)을 통해 반올림을 통해 int로 변환합니다.

반올림 일반 round(), ceil(), floor()를 통하지 않습니다. 그들은 또한 두 배를 반환합니다.

그리고 이를 통해 일반 작업보다 더 빠르게 작업합니다.

 int Ceil ( double x) { return (x-( int )x> 0 )?( int )x+ 1 :( int )x;}
int Round( double x) { return (x> 0 )?( int )(x+ 0.5 ):( int )(x- 0.5 );}
int Floor( double x) { return (x> 0 )?( int )x:(( int )x-x> 0 )?( int )x- 1 :( int )x;}

물론 엡실론을 통해 더 쉽고 빠르게:

 bool is_equal( double d1, double d2, double e= 0.000000001 ) { return fabs (d1-d2)<e;}