Sto sperimentando diverse implementazioni del metodo Newton per il calcolo delle radici quadrate. Una decisione importante è quando terminare l'algoritmo.Quale confronto in virgola mobile è più accurato e perché?
Ovviamente non farà utilizzare la differenza assoluta tra y*y
e x
dove y
è la stima corrente della radice quadrata di x
, perché per grandi valori di x
potrebbe non essere possibile rappresentare la sua radice quadrata con abbastanza precisione.
Quindi dovrei usare un criterio relativo. Ingenuamente avrei usato qualcosa del genere:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x)/x < EPS;
}
E sembra funzionare molto bene. Ma di recente ho iniziato a leggere Kernighan e di Plauger The Elements of Programming Style e danno un programma Fortran per lo stesso algoritmo nel capitolo 1, i cui criteri di terminazione, tradotto in C, sarebbe:
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
Entrambi sono matematicamente equivalenti
, ma esiste un motivo per preferire un modulo rispetto all'altro?
Questa è una grande domanda per [scicomp] (http://scicomp.stackexchange.com), una comunità beta StackExchange che ha come obiettivo il calcolo numerico sui computer. –