Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90

    [C/C++] Numero di cifre dopo la virgola

    So che è un argomento già affrontato, ma non ho trovato soluzioni...

    Ho un double di cui devo contare le cifre dopo la virgola. Potrei convertirlo in una stringa e contare i caratteri tra il . e il \0 ma non mi va molto a genio.

    In pratica mi servirebbe la potenza del 10 da moltiplicare a questo double per ottenere un intero.
    Qualcuno ha una soluzione?

  2. #2
    Uhm.. potresti fare un ciclo dove moltiplichi il double per 10 e controlli il resto di quel numero diviso per 10 (con n % 10): se il resto è diverso da 0, allora il numero non ha + cifre dopo la virgola e tenendoti un contatore nel ciclo, capisci quante cifre ci sono dopo la virgola.
    lolide
    Java Programmer

    Informati

  3. #3
    Non ha molto senso fare una cosa del genere, dato che i numeri in virgola mobile sono intrinsecamente imprecisi, oltre che per le perdite di precisione che si hanno in determinate operazioni, anche perché sono memorizzati con mantissa ed esponente limitate e in base due; questo significa che i numeri periodici, per forza di cose, sono arrotondati all'ultima cifra effettiva, e molti numeri che in base 10 non sono periodici diventano periodici (e quindi approssimati per forza di cose) in base due.
    Ad esempio 0.1 viene memorizzato come 0.100000000000000005551115123125782702118158340454 1015625 o roba del genere (per il troncamento/arrotondamento della sua rappresentazione binaria periodica), dunque qualunque algoritmo che tu possa inventarti non ti restituirà mai 1 come numero di cifre dopo la virgola, dato che il numero effettivamente memorizzato non è 0.1.
    Leggi qui per ulteriori dettagli.

    Incidentalmente, l'imprecisione intrinseca nei numeri in virgola mobile è il motivo per cui non si dovrebbero mai usare per memorizzare valori monetari, per cui vanno preferiti i tipi in virgola fissa o altre rappresentazioni che non hanno questi problemi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Quindi devo arrendermi?
    Il tipo di dato non è importante, va bene anche a virgola fissa o a qualunque altra cosa che mi permetta di rappresentare numeri decimali.

  5. #5
    Originariamente inviato da m4l13n
    Quindi devo arrendermi?
    Il tipo di dato non è importante, va bene anche a virgola fissa o a qualunque altra cosa che mi permetta di rappresentare numeri decimali.
    Per usare la virgola fissa (numeri interi) devi tenerti un altra variabile per memorizzare il numero di cifre decimali:

    codice:
    struct {
      int num;
      int dec;
    } FLOAT;
    oppure ancora meglio con una classe, facendo l'overloading degli operatori
    lolide
    Java Programmer

    Informati

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    In questo caso mi servirebbe un modo per separare le cifre prima e dopo la virgola...

  7. #7
    Originariamente inviato da m4l13n
    In questo caso mi servirebbe un modo per separare le cifre prima e dopo la virgola...
    codice:
    struct {
      int num;
      int dec;
    } FLOAT;
    
    FLOAT f;
    f.num = 1023;
    f.dec = 2;
    // Il numero è 10.23
    Se prendi d'esempio quel codice sopra, fai un ciclo per dec volte dividendo per 10 e recuperi il float.
    lolide
    Java Programmer

    Informati

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Non intendevo quello...
    Io parto sempre con un double. Dovrei a questo punto separarne le cifre decimali da quelle intere, ma a questo punto sono daccapo...

  9. #9
    Originariamente inviato da m4l13n
    Non intendevo quello...
    Io parto sempre con un double.
    Partendo con un double non puoi fare quello che chiedi, per il semplice fatto che il numero che viene memorizzato nel double è già "sbagliato". Puoi fare delle approssimazioni (dopo un tot di zeri che trovi decidi che il numero è finito lì), ma incorrerai comunque in errori (e tra l'altro credo che con le varie moltiplicazioni per 10 vai comunque ad aggiungere errori).
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Quindi non c'è modo... Grazie comunque...

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.