07/09/11 10:27
flavio89
Cari Ragazzi, avrei un problema con un programma assegnatomi per scopo universitario.
In pratica questo programmino somma molti elementi di un array dello stesso ordine di grandezza utilizzando un algoritmo già scritto dalla professoressa. Solo che, copiandolo, il risultato dato in output è inesatto!
Ho fatto, ad esempio, un prova riempendo l' array con 12 elementi, tutti 1.
Il risultato, per qualche motivo, però è pari a 15!
Non so come risolvere, sono giorni che ci sto su.
Vi allego il sorgente .c e la slide dove c'è l' algoritmo della prof. Fatemi sapere almeno dov' è l' errore, vi sarei grato!
slide flatul.altervista.org/…
Sorgente:
In pratica questo programmino somma molti elementi di un array dello stesso ordine di grandezza utilizzando un algoritmo già scritto dalla professoressa. Solo che, copiandolo, il risultato dato in output è inesatto!
Ho fatto, ad esempio, un prova riempendo l' array con 12 elementi, tutti 1.
Il risultato, per qualche motivo, però è pari a 15!
Non so come risolvere, sono giorni che ci sto su.
Vi allego il sorgente .c e la slide dove c'è l' algoritmo della prof. Fatemi sapere almeno dov' è l' errore, vi sarei grato!
slide flatul.altervista.org/…
Sorgente:
#include <stdlib.h> #include <stdio.h> #include <time.h> void fill_print (unsigned int,float []); // crea e stampa l' array float blocks (unsigned int,float []); //double per precisione float roundoff (); main () { unsigned int N = 12; float A[N]; srand (time(0)); puts ("Stampa dei 1000 elementi dell' array"); fill_print (N,A); puts ("\n\nSomma dei 1000 elementi dell' array"); printf ("%.2f",blocks(N,A)); printf ("\n\n\t Possibile errore di roundoff %.1f",roundoff()); puts (""); system ("pause"); } // fine MAIN void fill_print (unsigned int N,float A[]) { short i; for (i = 0; i < N; i++) { A[i] = 1.f; //rand() % 2; if (i % 4 == 0) printf ("\n"); printf ("%.2f\t",A[i]); } // fine FOR } float blocks (unsigned int N,float A[]) { unsigned int Nmezz; unsigned int i; while (N > 1) { Nmezz = N/2; for (i = 0; i < Nmezz; i++) { A[i] = A[i] + A[N-1-i]; if (N%2 == 0) N = Nmezz; else N = Nmezz+1; } // fine FOR } // fine WHILE return A[0]; } float roundoff () { float x = 1.0f, t = x+1; // appoggio while (t > 1) { x = x/2; t = x + 1; // 1+ 2^-n } // successione return 2.0f * x; }
aaa