Hoje, eu estava procurando por um código C ++ (escrito por outra pessoa) e encontrei esta seção:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Estou tentando descobrir se isso faz sentido.
A documentação para epsilon()
diz:
A função retorna a diferença entre 1 e o menor valor maior que 1 que é representável [por um duplo].
Isso também se aplica a 0, ou epsilon()
seja, o menor valor é maior que 0? Ou existem números entre 0
e 0 + epsilon
que podem ser representados por um double
?
Caso contrário, a comparação não é equivalente a someValue == 0.0
?
numeric_limits<>::epsilon
é enganoso e irrelevante. O que queremos é assumir 0 se o valor real diferir não mais do que alguns ε de 0. E ε deve ser escolhido com base na especificação do problema, não em um valor dependente da máquina. Eu suspeitaria que o epsilon atual é inútil, já que apenas algumas operações de FP podem acumular um erro maior que isso.