Salve!!!
esiste una funzione in c che mi possa varificare se
un un numero sia intero o decimale?
Salve!!!
esiste una funzione in c che mi possa varificare se
un un numero sia intero o decimale?
Immagino che il numero sia un float o double giusto?
Al momento mi viene in mente:
codice:float num = 3.4f; if (num == (float)(int)num) { // num non ha parte decimale. } else { // num ha parte decimale. }![]()
scusate se uppo questo vecchio topic, ma si potrebbe fare qualcosa come:
questo?codice:int decimal(float num) { int verif; verif=num; //in questo modo verif prende solo la parte intera di num if (num==verif) return 1; else return 0; }
oppure esiste l'equivalente in C/C++ della funzione Pascal/delphi TRUNC(); ?
edit: aspetta, forse ho capito l'esempio di xalbex
(float) (int) num
trasforma num in int ma lo alloca in memoria come un float, togliendo la parte decimale?
Come detto ha senso se comunque il valore è un float o un double e vuoi sapere se è intero senza parte decimale.
Hai capito bene l'esempio l'esempio di xalbex, gli esempi sono giusti entrambi, devi vedere se lasciando solo la parte intera (con un casting esplicito o assegnando semplicemente a un intero) il nuovo valore rimane uguale a quello iniziale.
Puoi anche usare in C o C++ la funzione ceil definita in math.h (ha anche alias cmath per il C++) per ottenere la parte intera (ritorna un double con un double e un float con un float).
Message by Webmaster UFO
http://forum.html.it/forum/faccine/054.gif CAUTION! THE NET IS DANGEROUS! http://forum.html.it/forum/faccine/144.gif
http://nadia.too.it TUTTO QUELLO CHE VUOI SAPERE SU JEAN, NADIA, NEMO, ELECTRA & CO.
NON CONSIGLIERO' PIU' NIENTE NELLA FIRMA!!!
Ti riferisci ad eventuali errori di rounding?devi vedere se lasciando solo la parte intera (con un casting esplicito o assegnando semplicemente a un intero) il nuovo valore rimane uguale a quello iniziale.
Io stavo solo spiegando gli esempi postati (avete scritto il codice ma non perché è così) e aggiunto che esiste a funzione ceil (per rispondere alla tua domanda sul trunc). Ho però confuso te con l'utente che aperto il topic e quindi ho risposto a due persone insieme
infatti ho detto che gli esempi erano giusti, anche il tuo. In effetti ceil o il casting esplicito sono più chiari e forse più sicuri, non so sono sicuro che come hai fatto tu sia sempre garantito il troncamento (forse dipende anche da piattaforma e compilatore, potrebbe interpretare alcuni bit come intero invece di troncare il valore decimale...). Ho fatto comunque una prova su codepad.org e sembra funzionare.
codice:void main() { int i = 3.7; float f = i; printf("%f", f); }}
Message by Webmaster UFO
http://forum.html.it/forum/faccine/054.gif CAUTION! THE NET IS DANGEROUS! http://forum.html.it/forum/faccine/144.gif
http://nadia.too.it TUTTO QUELLO CHE VUOI SAPERE SU JEAN, NADIA, NEMO, ELECTRA & CO.
NON CONSIGLIERO' PIU' NIENTE NELLA FIRMA!!!
Se le performance sono importanti credo che la cosa più veloce sia la funzione modf (soluzioni come cast ad intero e confronto sono relativamente più "costose" a confronto)
Nota però che se numero è ottenuto dopo un tot di calcoli è facile che, se anche teoricamente dovrebbe essere intero, la sua parte decimale sia piccolissima ma diversa da zero (lavorando in virgola mobile si accumulano facilmente piccoli errori), per cui conviene piuttosto verificare se il valore restituito da fmod non è minore in valore assoluto di un certo epsilon.codice:if(modf(numero,NULL)!=0.) { /* il numero ha parte decimale */ }
Amaro C++, il gusto pieno dell'undefined behavior.
Ha ragione Mittaly. Il casting e l'assegnamento a intero vanno bene, ceil invece dà l'intero SUPERIORE più vicino (coè con 3.1 dà 4, ho sbagliato ma ho dato il mio contributo spiegando gli esempi degli altri, che sarà mai se poi ho aggiunto un esempio sbagliato? al limite se lo provavi capivi cosa NON dovevi fare
). Non conoscevo modf ma adesso che lo so confermo che devi usare quella.
Ancora non ti hanno spiegato l'esempio inviato :-) modf prende due parametri: il primo è il numero che vuoi controllare, il secondo è un puntatore a un valore intero che poi punterà la locazione (l'area di memoria, il "posto") in cui ci sarà la parte intera del numero passato come primo parametro. La funzione restituisce la parte frazionaria (quella dopo la virgola) e se è 0 vuol dire che non c'era e allora il valore era intero.
Message by Webmaster UFO
http://forum.html.it/forum/faccine/054.gif CAUTION! THE NET IS DANGEROUS! http://forum.html.it/forum/faccine/144.gif
http://nadia.too.it TUTTO QUELLO CHE VUOI SAPERE SU JEAN, NADIA, NEMO, ELECTRA & CO.
NON CONSIGLIERO' PIU' NIENTE NELLA FIRMA!!!
Chiarissimi tutti e due, grazie.Originariamente inviato da webmasterufo
Ha ragione Mittaly. Il casting e l'assegnamento a intero vanno bene, ceil invece dà l'intero SUPERIORE più vicino (coè con 3.1 dà 4, ho sbagliato ma ho dato il mio contributo spiegando gli esempi degli altri, che sarà mai se poi ho aggiunto un esempio sbagliato? al limite se lo provavi capivi cosa NON dovevi fare
). Non conoscevo modf ma adesso che lo so confermo che devi usare quella.
Ancora non ti hanno spiegato l'esempio inviato :-) modf prende due parametri: il primo è il numero che vuoi controllare, il secondo è un puntatore a un valore intero che poi punterà la locazione (l'area di memoria, il "posto") in cui ci sarà la parte intera del numero passato come primo parametro. La funzione restituisce la parte frazionaria (quella dopo la virgola) e se è 0 vuol dire che non c'era e allora il valore era intero.
Purtroppo per ora ho problemi con visual c++ (non so usarlo :P) e ho difficoltà a compilare.
in che libreria è contenuta questa funzione modf?
Non è questione di libreria ... devi includere l'header math.h
#include <math.h>
No MP tecnici (non rispondo nemmeno!), usa il forum.