Newsgroup: it.comp.lang.c++
Titolo: Float con int

Voi vi metterete a ridere ma oggi scrivendo dei semplici programmi per il
compito che ho domani ho notato una cosa che non sapevo. Se io faccio la
divisione tra due interi, tipo tra 1 e 2, e li metto in un float, il
risultato viene restituito come intero.
ma allora questi sono uguali?
int c = 1;
int b = 2;
float c = c / b;
e
int c = 1;
int b = 2;
int a = c / b;
Usando il Borland C++ 5.02 se scrivo cout << a; nei due casi scrive semore
0. Anche cosě:
float c = 1 / 2;
cout << c;
scrive a schermo 0. Ci sono rimasto veramente stupito. Ma perchč č cosě?
L'unico modo che ho trovato č stato questo:
int c = 1;
int b = 2;
float c = (float)c / b;
scrivendo a schermo il valore di c scrive 0.5. Oppure dichiarando tutto come
float. Ma perchč float c = 1 / 2, se scrivo a schermo viene visualizzato 0 e
non 0.5?
Grazie e scusate le domande ovvie.
Luca Carlon

 float c = (float)c / b;
A questo punto la divisione non č piů fra interi, visto che il dividendo
č stato convertito in float.
-- 
Per rispondere via email rimuovere 123

 è stato convertito in float.
Però ho notato che usando la funzione sqrt invece, anche se quello che sta
dentro è un int, il risultato può essere float:
int i = 2;
float c = sqrt(2);
cout << c;
viene fuori un decimale. E' per via del fatto che nella funzione sqrt, nel
return c'è una conversione forzata dell'intero in float o double? Altrimenti
dovrebbe ridarmi un intero giusto?
Grazie per la velocità.
Luca Carlon

 sta dentro è un int, il risultato può essere float:
Ti sei risposto da solo: "usando la funzione sqrt".
Dalla manpage di sqrt:
-----------------
SQRT(3)             Linux Programmer's Manual             SQRT(3)
NAME
       sqrt - square root function
SYNOPSIS
       #include <math.h>
       double sqrt(double x);
--- CUT ------
sqrt() è una funzione che restituisce comunque un valore float (anzi
double) indipendentemente da cosa gli butti dentro. Ovviamente se gli
passi un intero, questo viene prima convertito in double.
La divisione invece non è una funzione.


 sta dentro č un int, il risultato puň essere float:
[cut]
mi par di capire che tu abbia due numeri sul quando vengono effettute le 
conversioni. Penso che con alcuni esempi tu possa capire meglio:
float c = 1/2;
quando il compilatore trova questa riga *prima* valuta l'espressione 1/2 
e poi assegna il risultato alla variabile c: nota che nel valutare 
l'espressione non sa ancora nulla della variabile c (anzi, non sa 
neppure che poi il risultato verra` assegnato ad una variabile) quindi 
si basa solo sui tipi dei due operandi: dato che i tipi sono entrambi 
interi viene effettuata la divisione intera e il risultato di 1/2 e` 0. 
A questo punto deve assegnare il valore 0 a c, ed e` questo il risultato 
che vedi. Concettualmente il compilatore fa una cosa del tipo
        int tmp = 1/2;
        float c = tmp;
Dalle righe sopra e` evidente il motivo per cui il risultato e` 0 
anziche` 0,5.
float c = (float)1/2;
Qui e` diverso: il compilatore valuta prima di tutto (float)1/2: poiche` 
uno dei due operandi e` di tipo float viene eseguita la divisione 
decimale ed il risultato e` quello atteso.
Nel caso della funzione sqrt non c'e` alcun problema perche` la 
conversione viene fatta *prima* di chiamare la funzione: sqrt ha questo 
prototipo:
        double sqrt(double);
Quando tu scrivi
        float c = sqrt(2);
il compilatore la "pensa" come se fosse (concettualmente):
        double tmp = 2;
        double res = sqrt(tmp);
        float c = res;
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 ha scritto nel messaggio
news:a8i97t$cot$1...@newsreader.mailgate.org...

Grazie per tutte le informazioni. Avevo capito che questo fosse il
procedimento. Solo mi ero stupito di una cosa. Il ragionamento fila (come
sempre nell'informatica), il fatto è che un effetto lo trovo un pò strano
diciamo, ossia che io trovi 0 nel caso del float c = 1/2;
dato il rpocedimento del compilatore mi pare ovvio che il risultato sia
quello, solo ha effettivamente qualcosa di strano. Ora che lo so cmq
ovviamento vedrò di non sbagliare più. Grazie.
Luca Carlon