Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33

Discussione: [C] Cast Errato

  1. #1

    [C] Cast Errato

    Salve a tutti,
    sto impazzendo per un problema riguardo al cast di una variabile double a una variabile int.

    Esempio di codice:

    main()
    {
    double a=10.01;
    int int1;
    double a1;
    int b;

    int1=a; //Ricava la parte intera. Int1=10
    a1=(a-int1)*100; //Ricava la parte decimale. a1=1.00000

    b=a1; //Passo il valore di a1 a b che è intero. QUI C'è il problema!!
    printf("%d",b);
    system("pause");
    }


    Stampando la variabile b infatti, non mi stampa 1 ma 0!
    Quale potrebbe essere il problema e un'eventuale soluzione?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non si tratta di un cast errato ma del (classico) problema degli errori di conversione tra sistema binario e decimale riguardante i floating point.

    Senza entrare nel merito, puoi provare con

    int1=(int)a;
    b=(int)(a*100.0-int1*100.0);

    Considera che non e' necessaria la variabile intermedia e che e' sempre necessario indicare i cast da double ad int.

    Anche se l'espressione e' equivalente a quella da te usata, la sequenza di calcolo diversa evita il manifestarsi dell'errore ...

  3. #3
    Ho appena provato in quel modo...stesso risultato! Alla fine b risulta = 0 !

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il codice restituisce 1 ma ho provato con Visual C.

    Probabilmente tu stai utilizzando un altro compilatore (forse DevCpp ...) ... in questo caso, prova


    int1=(int)a;
    double x1=a*100.0;
    double x2=int1*100.0;
    b=(int)(x1-x2);

  5. #5
    Ora funziona..ma non riesco a vedere semanticamente la differenza tra la tua precedente versiona e l'ultima! MAH...cmq si, sto usando il Dev

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Infatti non e' una questione semantica, ma di accumulo (e recupero) di errori di conversione nei vari passaggi.

  7. #7
    Ci risiamo...il problema s'è risolto in alcuni casi, ma in altri continua ad esserci. Se prendo il 2,1 e lo moltiplico x 100.0 e poi gli faccio un cast a una variabile ottengo 209 anzichè 210!
    Assurdo

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Con Visual C++ 2003 e questo codice

    codice:
    double a=2.1;
    
    int int1=(int)a; 
    double x1=a*100.0;
    double x2=int1*100.0;
    int b=(int)(x1-x2);
    
    printf("%f %f %d %d\n", x1, x2, int1, b);
    ottengo

    210.000000 200.000000 2 10

  9. #9
    Puoi provare questo codice? Grazie

    int dec(float num)
    {
    int intero=(int)num; /*Ricava la parte intera*/
    float x1=num*100.0;
    float x2=intero*100.0;
    int dec=(int)(x1-x2);
    return dec; /*Restituisce la parte decimale*100*/
    }

    main(){
    double a=2.10;
    double b=1;
    int interi=0;

    do
    {
    int1=(int)a;
    dec1=dec(a);

    int2=(int)b;
    dec2=dec(b);

    if(dec1!=0 || dec2!=0)
    {
    a=a*100.0;
    b=b*100.0;
    interi=2;
    printf("Uno dei due numeri non e' intero. Si moltiplicano percio' entrambi x 100\n");
    }
    else
    interi=1;
    }
    while(interi==0);

    printf("Risultato=%d",int1);
    }

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Intanto non devi usare i

    float

    ma i

    double

    per i valori in virgola mobile. Se i double soffrono di problemi di arrotondamento, figurati i float. Quindi evitali.

    Poi, mi dovresti dire a cosa dovrebbe servire il codice, che risultati ti aspetti e cosa, invece, ottieni.

    P.S. Quando mostri del codice, usa gli appositi tag in modo che sia ben leggibile e venga mantenuta l'indentazione ...

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.