01/06/10 17:49
MagoAntò
Ciao a tutti!
Devo risolvere il seguente esercizio: "Scrivere una function C per calcolare una somma con il criterio di arresto naturale." Non sapendo quale particolare somma utilizzare, ho scelta una sommatoria decrescente: fissato n, abbiamo
1
_
i^2 con i che va da 1 a n
Come criterio di arresto naturale, uso il seguente criterio: continuo a calcolare le somme fin quando somma temp è maggiore o uguale di somma_temp per l'epsilon macchina. Il programma, inoltre, mi chiede anche di calcolare l'errore di roundoff, inteso come valore assoluto di (risultato_esatto-risultato)/(risultato_esatto). Risultato_esatto è calcolato come double per ottere la massima precisione possibile, mentre risultato come float.
Ecco il codice:
Sembra funzionare correttamente. Qualcuno ha qualche consiglio da darmi? Ho sbagliato qualcosa secondo voi? Grazie in anticipo per le risposte.
Devo risolvere il seguente esercizio: "Scrivere una function C per calcolare una somma con il criterio di arresto naturale." Non sapendo quale particolare somma utilizzare, ho scelta una sommatoria decrescente: fissato n, abbiamo
1
_
i^2 con i che va da 1 a n
Come criterio di arresto naturale, uso il seguente criterio: continuo a calcolare le somme fin quando somma temp è maggiore o uguale di somma_temp per l'epsilon macchina. Il programma, inoltre, mi chiede anche di calcolare l'errore di roundoff, inteso come valore assoluto di (risultato_esatto-risultato)/(risultato_esatto). Risultato_esatto è calcolato come double per ottere la massima precisione possibile, mentre risultato come float.
Ecco il codice:
#include <stdio.h> #include <float.h> #include <math.h> void sommatoria (short n); void main() { short n; printf("Inserisci il numero n delle delle somme da fare: "); scanf("%hd", &n); sommatoria (n); } // somma dei numeri che vanno da 1/1^2 a 1/n^2 void sommatoria (short n) { double risultato_esatto, errore_roundoff; float risultato; short i; risultato = 0; risultato_esatto = 0; i=1; // calcolo del risultato esatto (double) while ((i<=n) && (pow(1.f/i,2) >= DBL_EPSILON * risultato_esatto)) { risultato_esatto = risultato_esatto + pow(1.f/i, 2); i++; } printf("\nIl numero di passi per il calcolo del risultato double e': %hd\n", i-1); i=1; // calcolo del risultato approssimato (float) while ((i<=n) && (pow(1.f/i,2) >= FLT_EPSILON * risultato)) { risultato = risultato + (float)pow(1.f/i, 2); i++; } printf("\nIl numero di passi per il calcolo del risultato float e': %hd\n", i-1); errore_roundoff = fabs((risultato_esatto-risultato)/risultato_esatto); printf ("\nIl risultato calcolato come double e' = %lf\nIl risultato e' = %f\nL'errore di roundoff e' = %e\n", risultato_esatto, risultato, errore_roundoff); if(errore_roundoff<(0,5*FLT_EPSILON)) printf("Il risultato e' di massima accuratezza!\n\n"); else printf("il risultato non e' di massima accuratezza!\n\n"); }
Sembra funzionare correttamente. Qualcuno ha qualche consiglio da darmi? Ho sbagliato qualcosa secondo voi? Grazie in anticipo per le risposte.
Ultima modifica effettuata da MagoAntò 01/06/10 18:17
aaa