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++ - C Newbie ha problemi con un undefined behavior (Approssimazione della costante e matematica)
Forum - C/C++ - C Newbie ha problemi con un undefined behavior (Approssimazione della costante e matematica)

Avatar
Daniele T (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/04/2011

Segnala al moderatore
Postato alle 19:32
Giovedì, 28/04/2011
Ciao Ragazzi, Sono nuovo, ne approfitto per presentarmi e lo farò il prima possibile nella sezione apposito, se il forum ne dispone.

Mi chiamo Daniele ho 20 anni e mi sto avvicinando per la prima volta al linguaggio di programmazione C.

Dunque non riesco a capire perché il mio programma che sembra tanto scontato, mi restituisce un valore del risultato pari a "1,#INF00" ora con qualche piccola modifica del codice restituisce sempre il valore 2,00 ...Chiedo una mano a voi esperti, speriamo bene :) (Il commento spiega la consegna dell'esercizio)

Codice sorgente - presumibilmente C++

  1. /* in matematica la costante e = 1 + 1/1! + 1/2! + 1/2!... -> infinito
  2.    scrivere un programma che approssimi il valore di 'e' calcolando:
  3.    1+ 1/1! + 1/2! ... + 1/n! , con n immesso da tastiera
  4. */
  5.  
  6. #include <stdio.h>
  7.  
  8. int main (void) {
  9. unsigned short n;
  10. float eValue = 1.00f;
  11. int i,j, den = 1;
  12. printf("Ins n");
  13. scanf("%hd", &n);
  14. for (i=1; i<=n; i++) {
  15.     j = i;
  16.     while (j > 0) {
  17.           den *= j;
  18.           j--;
  19.     }
  20.     eValue += (1/den);
  21. }
  22. printf("eValue: %.2f", eValue);
  23. scanf("%hd", &n);        
  24. }



PS. non fate caso alla struttura del programma, è stato sottoposto a 1000 modifiche nella speranza di trovare una soluzione :) Ciaooo

PM
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Up
3
Down
V
Segnala al moderatore
Postato alle 19:44
Giovedì, 28/04/2011
I problemi sono due:
Codice sorgente - presumibilmente C/C++

  1. for (i=1; i<=n; i++) {
  2.     j = i;
  3.     while (j > 0) {
  4.           den *= j;
  5.           j--;
  6.     }
  7.     eValue += (1/den);
  8. }


1) l'espressione (1/den) non dà un float, bensì un int, per questo il programma dà 2: il risultato viene arrotondato
metti eValue += (1.f/den);
2) ad ogni iterazione devi mettere den = 1; altrimenti avrai il calcolo del fattoriale sbagliato

Ultima modifica effettuata da lumo il 28/04/2011 alle 19:45
Grazie Lumo, ora va meglio, però oltre un certo valore n, mi restituisce sempre 2,72 e con un n molto alto restituisce 1.#J - Daniele T - 28/04/11 19:57
Se metti printf("eValue: %f", eValue); il valore non viene arrotondato alla seconda cifra decimale e quindi potrai vedere l'aumento di precisione. Dopo un certo punto è ovvio che restituisca inf, perchè il valore di eValue è troppo alto per essere gestito da un float - lumo - 28/04/11 20:03
no, è "den" che diventa troppo grande... - TheKaneB - 29/04/11 00:32
sì scusa :D - lumo - 02/05/11 23:03
PM