Confusione con numeri in virgola mobile
-
27-09-2019 - |
Domanda
int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
Output:
340.000000 // It's ok.
Ma se x=3.1234e2
scrittura l'uscita è 312.339996
e se x=3.12345678e2
l'uscita è 312.345673
.
Perché sono le uscite come queste? Penso che se scrivo x=3.1234e2
l'uscita dovrebbe essere 312.340000
, ma l'uscita effettiva è 312.339996
usando il compilatore GCC.
Soluzione
Non tutti i numeri frazionari hanno un esatto equivalente binario quindi viene arrotondato al valore più vicino.
esempio semplificato,
se si dispone di 3 bit per la frazione, si può avere:
0
0.125
0.25
0.375
...
0.5 ha una rappresentazione esatta, ma 0.1 verrà visualizzato come 0,125.
Naturalmente le differenze reali sono molto più piccole.
Altri suggerimenti
numeri a virgola mobile sono normalmente rappresentati come frazioni binarie volte una potenza di due, per l'efficienza. Questo è circa accurato come base 10 rappresentazione, tranne che ci sono frazioni decimali che non possono essere rappresentati come esattamente frazioni binarie. Sono, invece, rappresentati come approssimazioni.
Inoltre, un float
è normalmente lungo 32 bit, il che significa che non ha tutte che molte cifre significative. Si può vedere nei tuoi esempi che sono una precisione di circa 8 cifre significative.
Si sono, tuttavia, la stampa i numeri per un po 'al di là del loro significato, e quindi si sta vedendo la differenza. Guardate il vostro printf
documentazione stringa di formato per vedere come stampare un numero di cifre.
Potrebbe essere necessario per rappresentare i numeri decimali esattamente; questo accade spesso in applicazioni finanziarie. In tal caso, è necessario utilizzare una libreria speciale per rappresentare i numeri, o semplicemente calcolare tutto come numeri interi (come quella di rappresentare quantità come centesimi piuttosto che come dollari e le frazioni di dollari).
Il riferimento standard è Ciò che ogni computer Scientist dovrebbe conoscere circa aritmetica alla virgola mobile , ma sembra che sarebbe stato molto avanzato per voi. In alternativa, si potrebbe Google formati in virgola mobile (in particolare IEEE formati standard) oppure cercare su Wikipedia, se si voleva i dettagli.