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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top