Problemi con dato float

di il
4 risposte

Problemi con dato float

Ho riscontrato un problema con il dato float "parte_decimale" quando vado a convertire la parte decimale di un numero (in base 10) in binario. I risultati li salvo nel vettore "num_bin_ch". (Non ci si soffermi sul contatore)

for(a=a+1;a<MAXBIN;a++){
      parte_decimale*=2;
      if(parte_decimale>=1){
        num_bin_ch[a]='1';
        parte_decimale=parte_decimale-1;
      }else{
        num_bin_ch[a]='0';
      }
      if(parte_decimale==0) break;
    }
Il problema sorge quando vado a stampare i valori della parte decimale durante la conversione:
Es. 0.36

0.720000
0.440000
0.880000
0.760000
0.520000
0.040001
0.080002
0.160004
0.320007
0.640015
0.280029
0.560059
0.120117
0.240234
0.480469
0.960938
0.921875
0.843750
0.687500
0.375000
0.750000
0.500000
0.000000

Non capisco perchè ad un certo punto viene aggiunto un '1' a caso . L'aggiunta di quell'uno mi cambia il risultato finale
Come faccio a risolvere questo problema?

4 Risposte

  • Re: Problemi con dato float

    Innanzitutto comincia a riformulare il problema specificando esattamente cosa devi fare, perché da es. 0.36 a 0.040001 con l'ultima cifra in rosso non si capisce quale siano i passaggi logici che hai fatto.
    Poi il codice di esempio deve essere completo: difficile valutare la correttezza di un codice senza nemmeno sapere cosa viene fatto (parte_decimale quanto vale prima che lo moltiplichi?)
  • Re: Problemi con dato float

    Il programma è troppo lungo per essere allegato completamente. Riguarda la conversione da numero decimale a Standard IEEE-P754.
    "parte_decimale" prima di essere moltiplicata ha valore 0.36 calcolato precedentemente.
    //trasformo l'array della parte decimale in numero decimale
        parte_decimale=0;
        for(i=1; i<=4; i++)  parte_decimale+=parte_dec[i-1]*pow(10,-i);
    Ciò che voglio capire è come risolvere il problema evidenziato in rosso (ovvero l'aggiunta ingiustificata dell'1)
  • Re: Problemi con dato float

    Si dovrebbe prendere del codice, copiarlo ed eseguirlo ma se mancano pezzi questo non può essere fatto e non si può dare una risposta.

    In ogni caso, mi sembra che siano semplici conseguenze dei noti problemi di precisione nella rappresentazione dei valori in virgola mobile.

    Prova con i double al posto dei float per vedere se il problema si attenua.
  • Re: Problemi con dato float

    Il problema che riscontri e' un problema legato alla rappresentazione in base binaria dei numeri ed al fatto che la rappresentazione ha un numero finito di cifre (binarie).

    Tale problema NON E' RISOLVIBILE.
    Si può solo mitigare un po' usando i double, MA QUESTO NON RISOLVE, sposta solo quel benedetto 1 un po' piu' lontano.

    Quello che puoi fare e' cercare di usare l'arrotondamento ad un predeterminato numero di decimali.
    MITIGA, NON RISOLVE
Devi accedere o registrarti per scrivere nel forum
4 risposte