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++ - Problema
Forum - C/C++ - Problema "somma di molti addendi"

Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 12:27
Mercoledì, 07/09/2011
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 http://flatul.altervista.org/P2_03_04_AT.pdf

Sorgente:
Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. void fill_print (unsigned int,float []); // crea e stampa l' array
  6. float blocks (unsigned int,float []); //double per  precisione
  7. float roundoff ();
  8.  
  9. main () {
  10.     unsigned int N = 12;
  11.     float A[N];
  12.     srand (time(0));
  13.     puts ("Stampa dei 1000 elementi dell' array");
  14.     fill_print (N,A);
  15.  
  16.     puts ("\n\nSomma dei 1000 elementi dell' array");
  17.     printf ("%.2f",blocks(N,A));
  18.  
  19.     printf ("\n\n\t Possibile errore di roundoff %.1f",roundoff());
  20. puts ("");
  21. system ("pause");
  22. } // fine MAIN
  23.  
  24.  
  25. void fill_print (unsigned int N,float A[]) {
  26.     short i;
  27.  
  28.     for (i = 0; i < N; i++) {
  29.         A[i] = 1.f;                                   //rand() % 2;
  30.         if (i % 4 == 0)  printf ("\n");
  31.         printf ("%.2f\t",A[i]);
  32.     } // fine FOR
  33. }
  34.  
  35. float blocks (unsigned int N,float A[]) {
  36.     unsigned int Nmezz;
  37.     unsigned int i;
  38.  
  39.     while (N > 1) {
  40.         Nmezz = N/2;
  41.         for (i = 0; i < Nmezz; i++) {
  42.             A[i] = A[i] + A[N-1-i];
  43.             if (N%2 == 0) N = Nmezz;
  44.             else N = Nmezz+1;
  45.         } // fine FOR
  46.     } // fine WHILE
  47.  
  48.     return A[0];
  49. }
  50.  
  51. float roundoff () {
  52.     float x = 1.0f,
  53.           t = x+1;  // appoggio
  54.  
  55.     while (t > 1) {
  56.         x = x/2;
  57.         t = x + 1;  // 1+ 2^-n
  58.     }   // successione
  59.  
  60.     return 2.0f * x;
  61. }



PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:47
Mercoledì, 07/09/2011
Guarda che non è così

Codice sorgente - presumibilmente Delphi

  1. for (i = 0; i < Nmezz; i++) {
  2.             A[i] = A[i] + A[N-1-i];
  3.             if (N%2 == 0) N = Nmezz;
  4.             else N = Nmezz+1;
  5.         } // fine FOR



Codice sorgente - presumibilmente C/C++

  1. for (i = 0; i < Nmezz; i++)
  2.             A[i] = A[i] + A[N-1-i];
  3.  
  4.         if (N%2 == 0) N = Nmezz;
  5.             else N = Nmezz+1;




... basta solo "copiare" con attenzione ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 13:42
Mercoledì, 07/09/2011
Ti ringrazio... non meritavo neanche risposta! ti devo un caffè

PM Quote
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Segnala al moderatore
Postato alle 18:46
Mercoledì, 07/09/2011
Testo quotato

Postato originariamente da flavio89:

ti devo un caffè


PM Quote
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 22:13
Mercoledì, 07/09/2011
Gia visto... eheh... ma sempre divertente!

PM Quote