So che sembra un compito a casa, ma non lo è. Ultimamente mi sono interessato agli algoritmi utilizzati per eseguire determinate operazioni matematiche, come seno, radice quadrata, ecc. Al momento, sto cercando di scrivere lo Babylonian method di calcolare le radici quadrate in C#.Come posso migliorare questo metodo di radice quadrata?
Finora, ho questo: metodo ogni volta
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;
}
funziona bene e produce la stessa risposta esatta come Math.Sqrt del .NET Framework(). Come puoi probabilmente intuire, però, è più lento del metodo nativo (di circa 800 tick). So che questo particolare metodo non sarà mai più veloce del metodo nativo, ma mi chiedo solo se ci sono delle ottimizzazioni che posso fare.
L'unica ottimizzazione che ho visto immediatamente era il fatto che il calcolo sarebbe stato eseguito 100 volte, anche dopo che la risposta era già stata determinata (a quel punto, r avrebbe sempre lo stesso valore). Così, ho aggiunto un controllo rapido per vedere se il nuovo valore calcolato è lo stesso del valore calcolato in precedenza e uscire dal ciclo. Sfortunatamente, non ha fatto molta differenza in termini di velocità, ma mi è sembrata la cosa giusta da fare.
E prima di dire "Perché non usare solo Math.Sqrt() invece?" ... Lo sto facendo come esercizio di apprendimento e non intendo utilizzare effettivamente questo metodo in alcun codice di produzione.
Confrontare i doppi non è mai una buona idea. – Carra
typo: s/"Metodo di Newton"/"Metodo babilonese" - Il metodo di Newton funziona bene per la velocità di convergenza (con alcune avvertenze sul fatto che converga) –
Se la radice è maggiore di 2^52 * eps, allora è bene possibile che r oscilla attorno alla radice e che Math.Abs (r-last) non è mai più piccolo di eps. Quindi, mentre questa proposta è un po 'migliore del programma originale, può ancora portare a molte più iterazioni del necessario. – Accipitridae