Hoy, estaba buscando un código C ++ (escrito por otra persona) y encontré esta sección:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Estoy tratando de averiguar si esto tiene sentido.
La documentación para epsilon()
dice:
La función devuelve la diferencia entre 1 y el valor más pequeño mayor que 1 que es representable [por un doble].
¿Esto se aplica también a 0, epsilon()
es decir, el valor más pequeño es mayor que 0? ¿O hay números entre 0
y 0 + epsilon
que pueden ser representados por a double
?
Si no, ¿no es la comparación equivalente a someValue == 0.0
?
numeric_limits<>::epsilon
es engañoso e irrelevante. Lo que queremos es asumir 0 si el valor real difiere en no más de algunos ε de 0. Y ε debe elegirse en función de la especificación del problema, no en un valor dependiente de la máquina. Sospecho que el epsilon actual es inútil, ya que incluso unas pocas operaciones de FP podrían acumular un error mayor que eso.