Newsgroup: it.comp.lang.c
Titolo: Conversione float -> int in ANSI C

Salve a tutti,
mi e' sorto un problema tentando di compilare un programma con gcc e il
flag -ansi.
In pratica, se tento di assegnare ad un intero un valore float gia'
arrotondato (es: avrei un valore del tipo 13.0000), anche se faccio
precedere il valore float da un casting a int, il risultato completamente
errato.
Qualcuno saprebbe darmi un suggerimento?
Grazie a tutti.
Paolo.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Qualcuno saprebbe darmi un suggerimento?
Non capisco il tup problema
Mostra un esempio delle linee che secondo te
contengono l'errore.
non ti funziona qualcosa del tipo:
int main()
{
   float f;
   int i;
   f= 13.0;
   i = (int) f;
   printf("intero = %d\n",i);
   return 0;
}
ciao,
g.

 g.
Esattamente; fai che sia una cosa del genere:
int main()
{
float f1,f2;
int i;
f1= 13.0;
f2= -17.725;
i = (int) floorf(f1/f2);
printf("intero = %d\n",i);
return 0;
}
-- 


 
anche aggiungendo
#include<math.h> che manca al tuo programma
mi sembra che il problema sia nell'uso congiunto
della funzione floorf e di -ansi (che non conosco bene,
non avendolo mai usato).
Infatti se invece di usare il cast a intero
usi
float f3;
e f3 =  floorf(f1/f2);
e poi stampi f3 vedrai che gia' f3 e' errato,
e quindi non e' nel cast che sta il problema.
Non so quale e' la risposta, ma posso suggerire una
soluzione:
ti definisci tu una funzione che fa quello che deve fare la
floorf:
ovvero restituire un intero che approssima (dal basso)
il tuo numero float.
la funzione che cerchi e' per esempio
int myfloorf(float f)
{
   if (f>=0.0) return (int)f;
   else return -1 + (int) f;
}
e si basa sul fatto che la conversione
da float a int di un numero usa il troncamento dei
decimali (che ovviamente si comporta in modo diverso da floorf per
quel che riguarda i numeri negativi).
Infine: perche' mai usi i numeri float invece dei double ?
ciao,
g.

 Infine: perche' mai usi i numeri float invece dei double ?
Forse perche' non gli serve tutta la precisione dei double, e preferisce 
occupare meta' della memoria richista dai double?
Dan


Anche se si parla di flag dell gcc, e non proprio proprio del C 
standard, faccio lo strappo alla regola ;)
Credo che il motivo sia il floorf. Ovvero: "-ansi" == "-std=c89", e nel 
C89 solo la funzione 'floor' esiste; la 'floorf' invece no (tant'e' che, 
compilando con -ansi -Wall -pedantic, il gcc da warning di funzione non 
definita, sostituendolo invece con -std=c99 invece non lo da).
Percie' nel primo caso il compilatore linka con una funzione non 
definita, che quindi, per default, suppone ritornare un int - e qui sta 
il problema, dato che, supponendo che ritorni un int, il cast ad int non 
viene tradotto con nessun codice, e quindi quello che va a finire 
nell'int e' probabilmente tutto, o un pezzo, della rappresentazione 
binaria del valore ritornato da floorf. Tant'e' vero che, compilando con 
-std=c99 o semplicemente senza alcun -ansi o -std, il risultato e' corretto.
Come sempre, e' meglio abilitare tutti i warning :)
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

 Dan
Sě, ho scelto il tipo float proprio per questo; comun que grazie a tutti,
alla fine ho risolto riscrivendo el funzioni floor e ceil come mi aveva
consigliato Giovanni.
Maledetto progetto di algoritmi... ora so cosa vuol dire compilare con
-Wall e -ansi! :(
Ciao a tutti!


 -Wall e -ansi! :(
Significa trovare prima gli errori...


 Significa trovare prima gli errori...
Completamente d'accordo, ma significa anche flessibilità zero: ora, va
bene che questo era un progetto didattico, e che il suo scopo ultimo era
perciò quello di insegnare a produrre codice il più pulito possibile, ma
in fese di sviluppo, almeno per quanto mi riguarda, un minimo di
flessibilità da parte del compilatore mi darebbe una mano.
A tal proposito mi ricordo un estratto di uno speech che Paul Graham tenne
ad Harvard, in cui sottolineava la quasi necessità di un linguaggio di
programmazione che desse la possibilità di "buttare giù uno schizzo del
programma", mentre si è in fase di sviluppo.
Ve la segnalo, io l'ho trovata molto interessante, soprattutto perchè si
basa sul raffronto tra le mie due più grandi passioni: l'arte e la
programmazione, e come molto spesso chi si cimenta in entrambe trovi dei
punti di contatto tra esse:
http://www.paulgraham.com/hp.html
