Newsgroup: it.comp.lang.c
Titolo: Domanda cretina su int e float

Scusate per la domanda stupida,
ma ho iniziato studiare un po' di C da soli 3 giorni.
Ho fatto questo piccolo programma che calcola (approssimando) il valore
della costante matematica e:
#include <stdio.h>
main ()
{
     int i=1;
     float e=0, fatt=1;
     while (i <= 20)
     {
          e += (1 / (fatt *= i));
          i++;
     }
    e += 1;
    printf ("\nIl valore approssimato della costante e e' %f.\n\n", e);
    return 0;
}
Il problema è che funziona solo se dichiaro la variabile "fatt" come float.
A me sembrerebbe più logico definirla int perchè il fattoriale è un valore
intero; però se faccio così il risultato della divisione 1/fatt risulta un
intero, anche se la variabile "e" è un float.
Non riesco a capire la logica. Il C quando si trova a lavorare tra int e
float, non trasforma automaticamente i primi in float.
Grazie mille.
CHECCO.
PS.
Se il programmino è fatto molto male, accetto suggerimenti e correzioni per
migliorarlo.

float, non trasforma automaticamente i primi in float.
Hint: prova a
scrivere:
          e += (1. / (fatt *= i));
col punto dopo l'1 lo
considera un float e quindi fa il cast di quello che viene dopo a float.
Ex.
  int a;
  float b;
  se fai a/b il risultato e' un int, se fai b/a
il risultato e' un float...
--------------------------------
Inviato via 
http://usenet.iol.it
 

 ha scritto nel messaggio
news:147Z162Z171Z204...@usenet.iol.it...



il "cast automatico" viene applicato "solo" quando serve... in altre
parole quando il compilatore esamina (fatt *= i) vede che sono
entrambi interi e quindi lascia stare, poi guarda 1 / (fatt....) e
vede che sono ancora tutti interi, poi quando va a sommare il valore
fin qui ottenuto con "e" lo trasforma in float... ma ormai e' troppo
tardi!
..spero di essermi spiegato..
ciao
Andrea

 float, non trasforma automaticamente i primi in float.
Una variabile float puň rappresentare un numero molto piů grande, a
discapito di una perdita di precisione.
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

..spero di essermi spiegato..
Secondo me hai eclissato su cosa accade quando il compilatore si trova
ad effettuare una divisione tra interi.
Quando il compilatore si trova davanti un'espressione:
<int a> / <int b>
Lui la interpreta come divisione tra interi, quindi ti restituisce il
quoziente intero della divisione:
a/b = q+r
Dove q e' espresso come:
q tale che (q*b) < (a/b) < [(q+1)*b]
Quindi 10 / 4 diventera' 2 (4*2 = 8, 4*3 = 12).
"r" invece e' il resto della divisione (noto anche come modulo),
ovvero la differenza tra:
[(q+1)*b] - (q*b).
In C lo calcoli con a % b.
Se vuoi invece che la divisione tra interi venga considerata come
divisione tra float tu devi dirlo espressamente al compilatore e hai 2
modi per farlo:
1) esprimere uno dei 2 valori come float, cosi' l'altro verra' castato
esplicitamente
es: 1.0 / fatt
2) castare uno dei 2 interi (o entrambi, ma non serve) a float.
es: (float)1 / fatt
es: 1 / (float)fatt
Se tu facessi il cast DOPO la divisione tu semplicemente otterresti la
divisione tra interi, ma immagazzinata in una variabile di tipo float:
in pratica (float)(10/4) = 2.0
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."