Al comparar dobles para la igualdad, tenemos que dar un nivel de tolerancia, porque el cálculo de coma flotante podría introducir errores. Por ejemplo:comparación de punto flotante de asignación constante
double x;
double y;
x = f();
y = g();
if (fabs(x-y)<epsilon) {
// they are equal!
} else {
// they are not!
}
Sin embargo, si simplemente asigno un valor constante, sin ningún tipo de cálculo, ¿sigue siendo necesario para comprobar la épsilon?
double x = 1;
double y = 1;
if (x==y) {
// they are equal!
} else {
// no they are not!
}
¿Es ==
comparación lo suficientemente bueno? O tengo que hacer fabs(x-y)<epsilon
otra vez? ¿Es posible introducir un error en la asignación? ¿Soy demasiado paranoico?
¿Qué hay de fundición (double x = static_cast<double>(100)
)? ¿Va a introducir también un error de coma flotante?
estoy usando C++ en Linux, pero si se diferencia por el idioma, me gustaría entender que también.
Si necesita un epsilon depende de la situación. P.ej. cuando necesitas una igualdad transitiva ('a == b && b == c' implica' a == c'), entonces no puedes usar un épsilon. Por cierto, 'doble x = 1' ya significa 'doble x = static_cast (1)' –
MSalters