Sé que esto suena como una tarea de tarea, pero no lo es. Últimamente me interesaron los algoritmos utilizados para realizar ciertas operaciones matemáticas, como sinusoide, raíz cuadrada, etc. En este momento, estoy tratando de escribir el Babylonian method de cálculo de raíces cuadradas en C#.¿Cómo puedo mejorar este método de raíz cuadrada?
Hasta ahora, tengo unas pocas cosas: método cada vez que
public static double SquareRoot(double x) {
if (x == 0) return 0;
double r = x/2; // this is inefficient, but I can't find a better way
// to get a close estimate for the starting value of r
double last = 0;
int maxIters = 100;
for (int i = 0; i < maxIters; i++) {
r = (r + x/r)/2;
if (r == last)
break;
last = r;
}
return r;
}
Funciona muy bien y produce exactamente la misma respuesta que Math.Sqrt de .NET Framework(). Sin embargo, como probablemente puedas adivinar, es más lento que el método nativo (alrededor de 800 tics). Sé que este método particular nunca será más rápido que el método nativo, pero me pregunto si hay optimizaciones que pueda hacer.
La única optimización que vi de inmediato fue el hecho de que el cálculo se ejecutaría 100 veces, incluso después de que la respuesta ya hubiera sido determinada (en ese punto, r siempre sería el mismo valor). Entonces, agregué una comprobación rápida para ver si el valor recién calculado es el mismo que el valor calculado previamente y salgo del ciclo. Desafortunadamente, no hizo mucha diferencia en la velocidad, pero parecía lo correcto.
Y antes dices "¿Por qué no utilizas Math.Sqrt() en su lugar?" ... Lo hago como ejercicio de aprendizaje y no pretendo utilizar este método en ningún código de producción.
Comparar los dobles nunca es una buena idea. – Carra
typo: s/"Método de Newton"/"Método de Babilonia" - El método de Newton funciona bien para la velocidad de convergencia (con algunas advertencias sobre si converge) –
Si la raíz es mayor que 2^52 * eps, entonces es muy posible que r oscila alrededor de la raíz y que Math.Abs (r-last) nunca es menor que eps. Por lo tanto, si bien esta propuesta es un poco mejor que el programa original, puede llevar a muchas más iteraciones de las necesarias. – Accipitridae