Outra maneira de explicar o significado de DBL_EPSILON:
//+------------------------------------------------------------------+//| 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
}
DBL_EPSILON é apenas o tamanho do intervalo entre duplas consecutivas em [1,2).
Para entender melhor o DBL_EPSILON, considere o incremento de um contador de ponto flutuante:
//+------------------------------------------------------------------+//| 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);
}
}
Se o valor inicial do contador for 1,0, o tamanho da etapa (epsilon) do contador será 2,220446049250250313e-16 (DBL_EPSILON) ≈ 2 na 16ª casa decimal.
Se o valor inicial do contador for 1024, o tamanho da etapa (epsilon) do contador será 2,2737363675443232321e-13 (1024 * DBL_EPSILON) ≈ 2 na 13ª casa dec imal.
Se o valor inicial do contador for 4503599627370496 (2^52), o tamanho da etapa do contador será 1,0 (2^52 * DBL_EPSILON)= 1. Nesse intervalo, um double se comporta como um contador inteiro, nenhuma fração pode ser representada.
Você pode ver que os números menores têm intervalos menores entre eles, e os números maiores têm intervalos maiores entre eles.
Portanto, DBL_EPSILON é a taxa de erro relativa. relativo significa relativo à magnitude do número.
Em 1,0, o erro absoluto = 1 * 2,2204460492503131e-016 (DBL_EPSILON).
em d, o erro absoluto ≈ d * DBL_EPSILON.
(DBL_EPSILON é uma taxa de referência em 1,0, algo como a taxa de juros anual do banco, e é igual a 2^-52).
Uma observação: se você tentar imprimir 1024.0000000000003, ele imprimirá 1024.0000000000002 (arredondando para o número representável mais próximo), pois 1024.0000000000003 não é um número representável (número fp inexistente).
Os números representáveis anteriores/seguintes são alcançados por meio da manipulação de bits (enum como antes: DoubleAdvance(value, -1)) ou usando DBL_EPSILON:
A chamada OnTester() é desativada no testador do MT5 quando há um algoritmo de otimização genética e NÃO um critério de otimização personalizado?
Acho que não. Mas eu gostaria de fazê-lo... De preferência, sem análise de configuração.
PS. CARAUL!!! Tudo se foi! Em cada passagem de otimização (deveria/não deveria) - OnTester() é chamado, o que pode aumentar muito o tempo total de otimização!
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Explicação da definição de DBL_EPSILON:
Essa é uma explicação ruim, porque
Outra maneira de explicar o significado de DBL_EPSILON:
DBL_EPSILON é apenas o tamanho do intervalo entre duplas consecutivas em [1,2).
https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/
https://en.wikipedia.org/wiki/Machine_epsilon
Para entender melhor o DBL_EPSILON, considere o incremento de um contador de ponto flutuante:
Se o valor inicial do contador for 1,0, o tamanho da etapa (epsilon) do contador será 2,220446049250250313e-16 (DBL_EPSILON) ≈ 2 na 16ª casa decimal.
/* 1.0000000000000002 1.0000000000000004 1.0000000000000007 1.0000000000000009 1.000000000000001 1.0000000000000013 1.0000000000000016 1.0000000000000018 1.000000000000002 1.0000000000000022 */Se o valor inicial do contador for 1024, o tamanho da etapa (epsilon) do contador será 2,2737363675443232321e-13 (1024 * DBL_EPSILON) ≈ 2 na 13ª casa dec imal.
/* 1024.0000000000002 1024.0000000000005 1024.0000000000007 1024.000000000001 1024.0000000000011 1024.0000000000014 1024.0000000000016 1024.0000000000018 1024.000000000002 1024.0000000000023 */Se o valor inicial do contador for 4503599627370496 (2^52), o tamanho da etapa do contador será 1,0 (2^52 * DBL_EPSILON)= 1. Nesse intervalo, um double se comporta como um contador inteiro, nenhuma fração pode ser representada.
/* 4503599627370497.0 4503599627370498.0 4503599627370499.0 4503599627370500.0 4503599627370501.0 4503599627370502.0 4503599627370503.0 4503599627370504.0 4503599627370505.0 4503599627370506.0 */Você pode ver que os números menores têm intervalos menores entre eles, e os números maiores têm intervalos maiores entre eles.
Portanto, DBL_EPSILON é a taxa de erro relativa. relativo significa relativo à magnitude do número.
Em 1,0, o erro absoluto = 1 * 2,2204460492503131e-016 (DBL_EPSILON).
em d, o erro absoluto ≈ d * DBL_EPSILON.
(DBL_EPSILON é uma taxa de referência em 1,0, algo como a taxa de juros anual do banco, e é igual a 2^-52).
Uma observação: se você tentar imprimir 1024.0000000000003, ele imprimirá 1024.0000000000002 (arredondando para o número representável mais próximo), pois 1024.0000000000003 não é um número representável (número fp inexistente).
Isso é chamado de erro de representação:
Os números representáveis anteriores/seguintes são alcançados por meio da manipulação de bits (enum como antes: DoubleAdvance(value, -1)) ou usando DBL_EPSILON:
O DBL_EPSILON é usado principalmente para estimar (ou corrigir) erros de arredondamento fp após operações matemáticas em duplas (análise numérica):
|resultado verdadeiro - resultado fp| / resultado verdadeiro <= DBL_EPSILON
A chamada OnTester() é desativada no testador do MT5 quando há um algoritmo de otimização genética e NÃO um critério de otimização personalizado?
Acho que não. Mas eu gostaria de fazê-lo... De preferência, sem análise de configuração.
PS. CARAUL!!! Tudo se foi! Em cada passagem de otimização (deveria/não deveria) - OnTester() é chamado, o que pode aumentar muito o tempo total de otimização!
Quem puder ajudar... )))))
Em minha pesquisa, deparei-me com uma função interessante não documentada
você pode ocultar o comentário de entrada de uma caixa de diálogo
Postagem original aqui
https://www.mql5.com/ru/forum/1271#comment_9019
Em minha pesquisa, encontrei uma função não documentada interessante
você pode ocultar o comentário de entrada de uma caixa de diálogo
postagem original aqui
https://www.mql5.com/ru/forum/1271#comment_9019
No Tester, a tabela de histórico é substituída somente em dois casos.