Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Somma con criterio di arresto naturale
Forum - C/C++ - Somma con criterio di arresto naturale

Avatar
MagoAntò (Normal User)
Rookie


Messaggi: 42
Iscritto: 07/02/2009

Segnala al moderatore
Postato alle 19:49
Martedì, 01/06/2010
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:
Codice sorgente - presumibilmente C

  1. #include <stdio.h>
  2. #include <float.h>
  3. #include <math.h>
  4.  
  5. void sommatoria (short n);
  6.  
  7. void main()
  8. {
  9.         short n;
  10.         printf("Inserisci il numero n delle delle somme da fare: ");
  11.         scanf("%hd", &n);
  12.        
  13.         sommatoria (n);
  14. }
  15.  
  16. // somma dei numeri che vanno da 1/1^2 a 1/n^2
  17. void sommatoria (short n)
  18. {
  19.         double risultato_esatto, errore_roundoff;
  20.         float risultato;
  21.         short i;
  22.        
  23.         risultato = 0;
  24.         risultato_esatto = 0;
  25.         i=1;
  26.        
  27.         // calcolo del risultato esatto (double)
  28.        
  29.         while ((i<=n) && (pow(1.f/i,2) >= DBL_EPSILON * risultato_esatto))
  30.         {
  31.                 risultato_esatto = risultato_esatto + pow(1.f/i, 2);
  32.                 i++;
  33.         }
  34.        
  35.         printf("\nIl numero di passi per il calcolo del risultato double e': %hd\n", i-1);
  36.        
  37.         i=1;
  38.        
  39.         // calcolo del risultato approssimato (float)
  40.        
  41.         while ((i<=n) && (pow(1.f/i,2) >= FLT_EPSILON * risultato))
  42.         {
  43.                 risultato = risultato + (float)pow(1.f/i, 2);
  44.                 i++;
  45.         }
  46.        
  47.         printf("\nIl numero di passi per il calcolo del risultato float e': %hd\n", i-1);
  48.  
  49.         errore_roundoff = fabs((risultato_esatto-risultato)/risultato_esatto);
  50.        
  51.         printf ("\nIl risultato calcolato come double e' = %lf\nIl risultato e' = %f\nL'errore di roundoff e' = %e\n", risultato_esatto, risultato, errore_roundoff);
  52.        
  53.         if(errore_roundoff<(0,5*FLT_EPSILON))
  54.                 printf("Il risultato e' di massima accuratezza!\n\n");
  55.         else
  56.                 printf("il risultato non e' di massima accuratezza!\n\n");
  57. }



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ò il 01/06/2010 alle 20:17
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 1:38
Mercoledì, 02/06/2010
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) :)

PM Quote
Avatar
MagoAntò (Normal User)
Rookie


Messaggi: 42
Iscritto: 07/02/2009

Segnala al moderatore
Postato alle 9:08
Mercoledì, 02/06/2010
Testo quotato

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. :)

PM Quote