Oppure

Loading
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:
#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
01/06/10 23:38
TheKaneB
Il risultato "esatto" dovresti calcolarlo algebricamente (a carta e penna), perchè anche il double ha delle approssimazioni, e quindi un relativo errore di arrotondamento (o round-off come lo vuoi chiamare) :)
aaa
02/06/10 7:08
MagoAntò
Postato originariamente da TheKaneB:

Il risultato "esatto" dovresti calcolarlo algebricamente (a carta e penna), perchè anche il double ha delle approssimazioni, e quindi un relativo errore di arrotondamento (o round-off come lo vuoi chiamare) :)


Si, su questo hai ragione, ma è la professoressa che a lezione ci ha detto di usare il double come risultato esatto ed il float come sua approssimazione. :)
aaa