Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] verificare che un numero sia intero o decimale

    Salve!!!
    esiste una funzione in c che mi possa varificare se
    un un numero sia intero o decimale?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    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.
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    scusate se uppo questo vecchio topic, ma si potrebbe fare qualcosa come:
    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;
    }
    questo?

    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?

  4. #4
    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!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    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.
    Ti riferisci ad eventuali errori di rounding?

  6. #6
    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!!!

  7. #7
    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)
    codice:
    if(modf(numero,NULL)!=0.)
    {
        /* il numero ha parte decimale */
    }
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    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!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    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.
    Chiarissimi tutti e due, grazie.

    Purtroppo per ora ho problemi con visual c++ (non so usarlo :P) e ho difficoltà a compilare.

    in che libreria è contenuta questa funzione modf?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non è questione di libreria ... devi includere l'header math.h

    #include <math.h>
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.