//+------------------------------------------------------------------+//| Returns the size of a unit in the last place (machine epsilon) |//| for a specified double value. This is the positive distance |//| between this double value and the representable value next |//| larger in magnitude. |//+------------------------------------------------------------------+double machine_eps(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
dbl.bits++;
return dbl.value - value;
}
void OnStart()
{
double epsilon = machine_eps(1.0);
Print(epsilon); // 2.220446049250313e-16
}
//+------------------------------------------------------------------+//| Advances a fp double value by a specified number of epsilons. |//+------------------------------------------------------------------+double DoubleAdvance(constdoublevalue, constlong distance)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
dbl.bits += distance;
return dbl.value;
}
void OnStart()
{
double myvalue = 1.0;
//doubel myvalue = 1024.0;// Print the first 10 representable numbers from the counterfor (int i = 0; i < 10; i++)
{
myvalue = DoubleAdvance(myvalue, 1); // Increment the integer representation by 1 bit
Print(myvalue);
}
}
카운터의 초기 값이 1.0인 경우 카운터의 단계 크기(엡실론)는 소수점 16번째 자리에서 2.220446049250250313e-16 (DBL_EPSILON) ≈ 2가 됩니다.
DBL_EPSILON의 정의에 대한 설명입니다:
이는 다음과 같은 이유로 잘못된 설명입니다.
DBL_EPSILON의 의미를 설명하는 또 다른 방법입니다:
DBL_EPSILON은 [1,2)의 연속된 더블 사이의 간격 크기입니다.
https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/
https://en.wikipedia.org/wiki/Machine_epsilon
DBL_EPSILON을 더 잘 이해하려면 부동 소수점 카운터를 증가시켜 보십시오:
카운터의 초기 값이 1.0인 경우 카운터의 단계 크기(엡실론)는 소수점 16번째 자리에서 2.220446049250250313e-16 (DBL_EPSILON) ≈ 2가 됩니다.
/* 1.0000000000000002 1.0000000000000004 1.0000000000000007 1.0000000000000009 1.000000000000001 1.0000000000000013 1.0000000000000016 1.0000000000000018 1.000000000000002 1.0000000000000022 */
카운터의 초기 값이 1024인 경우 카운터의 단계 크기(엡실론 )는 소수점 13번째 자리에서 2.2737363675443232321e-13(1024 * DBL_EPSILON) ≈ 2가 됩니다.
/* 1024.0000000000002 1024.0000000000005 1024.0000000000007 1024.000000000001 1024.0000000000011 1024.0000000000014 1024.0000000000016 1024.0000000000018 1024.000000000002 1024.0000000000023 */
카운터의 초기 값이 4503599627370496 (2^52)인 경우 카운터의 단계 크기는 1.0 (2^52 * DBL_EPSILON)= 1이 됩니다 . 이 범위에서 배수는 정수 카운터처럼 작동하며 분수는 표현할 수 없습니다.
/* 4503599627370497.0 4503599627370498.0 4503599627370499.0 4503599627370500.0 4503599627370501.0 4503599627370502.0 4503599627370503.0 4503599627370504.0 4503599627370505.0 4503599627370506.0 */
숫자가 작을수록 그 사이의 간격이 작고, 숫자가 클수록 그 사이의 간격이 크다는 것을 알 수 있습니다.
따라서 DBL_EPSILON은 상대적인 오류율입니다. 상대적이란 숫자의 크기에 대한 상대적인 것을 의미합니다.
1.0에서 절대 오차 = 1 * 2.2204460492503131e-016 (DBL_EPSILON).
d에서 절대 오차 ≈ d * DBL_EPSILON.
(DBL_EPSILON은 은행의 연간 이자율과 같은 1.0의 기준 이자율이며 2^-52와 같습니다.)
참고: 1024.0000000000003을 인쇄하려고 하면 1024.0000000000002이 대신 인쇄됩니다(가장 가까운 표현 가능한 숫자로 반올림). 1024.0000000000003은 표현 가능한 숫자(존재하지 않는 fp 번호)가 아니기 때문입니다.
이를 표현 오류라고 합니다:
이전/다음 표현 가능한 숫자는 비트 조작(이전과 같은 열거형: DoubleAdvance(value, -1))을 통해 또는 DBL_EPSILON을 사용하여 도달할 수 있습니다:
DBL_EPSILON은 주로 복식에 대한 수학적 연산(수치 해석) 후 fp 반올림 오류를 추정(또는 수정)하는 데 사용됩니다:
|실제 결과 - fp 결과| / 실제 결과 <= DBL_EPSILON
사용자 지정 최적화 기준이 아닌 유전적 최적화 알고리즘이 있는 경우 MT5 테스터에서 OnTester() 호출이 비활성화되나요?
아닐 것 같습니다. 하지만 저는... 가급적이면 구성 구문 분석 없이.
추신. 카라 울!!! 모든 것이 사라졌습니다! 최적화의 각 패스 (해야 /해서는 안됨)에서 OnTester ()가 호출되므로 총 최적화 시간이 크게 늘어날 수 있습니다!
도와주세요... )))))
검색 중에 문서화되지 않은 흥미로운 기능을 발견했습니다.
대화 상자에 대한 입력 주석을 숨길 수 있습니다.
원본 게시물은 여기
https://www.mql5.com/ru/forum/1271#comment_9019
검색 중에 문서화되지 않은 흥미로운 기능을 발견했습니다.
대화 상자에 대한 입력 주석을 숨길 수 있습니다.
원본 게시물은 여기
https://www.mql5.com/ru/forum/1271#comment_9019
테스터에서는 두 가지 경우에만 히스토리 테이블을 덮어씁니다.