Calcolo di una radice quadrata
Ciao,
ho un esercizio del genere
Realizzare un programma che permetta di calcolare la radice quadrata di un numero positivo fornito da tastiera utilizzando il metodo di Newton.
Confrontare il risultato con quello fornito dalla funzione di libreria sqrt(x).
Metodo di Newton: per calcolare la radice quadrata di x, si applica iterativamente la relazione:
Rn = (Rn-1 + x / Rn-1) / 2 avendo posto
R0 = x
dove Rn e' il valore della radice all'iterazione n-esima e Rn-1 e' quello all'iterazione n-1.
Scegliere come criterio di terminazione che la differenza tra il valore calcolato in un'iterazione e quello calcolato nell'iterazione precedente sia minore di una SOGLIA prefissata. Operare in doppia precisione.
i miei dubbi riguardano l'ultima parte del testo, cioè lavorare in doppia precisione e utilizzare una soglia prefissata
per la doppia precisione, basta leggere un dato di tipo double, eseguire le varie istruzioni e mandarlo a video o devo tenere conto di una conversione di tipo da qualche parte ?
per la soglia prefissata invece non so come fare, cercando ho trovato una costante epsilon che però sembra non funzionare, forse devo includere una libreria ? Oppure devo definire io un valore da tenere come massima differenza ?
ho un esercizio del genere
Realizzare un programma che permetta di calcolare la radice quadrata di un numero positivo fornito da tastiera utilizzando il metodo di Newton.
Confrontare il risultato con quello fornito dalla funzione di libreria sqrt(x).
Metodo di Newton: per calcolare la radice quadrata di x, si applica iterativamente la relazione:
Rn = (Rn-1 + x / Rn-1) / 2 avendo posto
R0 = x
dove Rn e' il valore della radice all'iterazione n-esima e Rn-1 e' quello all'iterazione n-1.
Scegliere come criterio di terminazione che la differenza tra il valore calcolato in un'iterazione e quello calcolato nell'iterazione precedente sia minore di una SOGLIA prefissata. Operare in doppia precisione.
i miei dubbi riguardano l'ultima parte del testo, cioè lavorare in doppia precisione e utilizzare una soglia prefissata
per la doppia precisione, basta leggere un dato di tipo double, eseguire le varie istruzioni e mandarlo a video o devo tenere conto di una conversione di tipo da qualche parte ?
per la soglia prefissata invece non so come fare, cercando ho trovato una costante epsilon che però sembra non funzionare, forse devo includere una libreria ? Oppure devo definire io un valore da tenere come massima differenza ?
Risposte
"n.icola":
per la soglia prefissata invece non so come fare, cercando ho trovato una costante epsilon che però sembra non funzionare, forse devo includere una libreria ? Oppure devo definire io un valore da tenere come massima differenza ?
penso sia banalmente l'ultima che hai detto, magari definendola inizialmente come costante all'interno del programma.
ciao
Grazie, codino75
quindi, dato che la printf stampa un double con sei cifre decimali $0.000001$ andrebbe bene?
quindi, dato che la printf stampa un double con sei cifre decimali $0.000001$ andrebbe bene?
Forse non ho ancora capito, ma ho provato a fare cosi
int radice(double numero){
double radice = numero,
radicePrecedente;
do{
radicePrecedente = radice;
radice = ((radice-1) + numero/(radice-1))/2;
}while((radice-radicePrecedente)<= SOGLIA);
printf("\nla radice di %lf vale %lf", numero, radice);
return 0;
}
ho provato $sqrt(2)$ e mi da $2.5$
int radice(double numero){
double radice = numero,
radicePrecedente;
do{
radicePrecedente = radice;
radice = ((radice-1) + numero/(radice-1))/2;
}while((radice-radicePrecedente)<= SOGLIA);
printf("\nla radice di %lf vale %lf", numero, radice);
return 0;
}
ho provato $sqrt(2)$ e mi da $2.5$
Sempre se sia giusto trattare i dati come ho fatto io,
ho risolto leggendo la radice precedente invece di quella attuale
ho risolto leggendo la radice precedente invece di quella attuale