Estoy experimentando con diferentes implementaciones del método de Newton para calcular las raíces cuadradas. Una decisión importante es cuándo terminar el algoritmo.¿Qué comparación de punto flotante es más precisa y por qué?
Obviamente no va a hacer para utilizar la diferencia absoluta entre y*y
y x
donde y
es la estimación actual de la raíz cuadrada de x
, ya que para valores grandes de x
puede que no sea posible representar su raíz cuadrada suficiente precisión.
Así que se supone que debo usar un criterio relativo. Ingenuamente hubiera usado algo como esto:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x)/x < EPS;
}
Y esto parece funcionar muy bien. Sin embargo, recientemente he empezado a leer Kernighan y los elementos del estilo de programación de Plauger y dan un programa Fortran para el mismo algoritmo en el capítulo 1, cuyos criterios de terminación, traducido en C, sería:
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
Tanto son matemáticamente equivalentes
, pero ¿hay alguna razón para preferir una forma sobre la otra?
Esta es una gran pregunta para [scicomp] (http://scicomp.stackexchange.com), una comunidad beta StackExchange que se enfoca en cálculos numéricos en computadoras. –