Domanda

ritorna (int)(33.46639 * 1000000) 33466389

Perché accade questo?

È stato utile?

Soluzione

calcoli in virgola mobile non è perfetto. Ciò che ogni programmatore dovrebbe sapere su di esso.

  

aritmetica in virgola mobile è considerato un argomento esoterico da molte persone. Questo è piuttosto sorprendente perché virgola mobile è onnipresente nei sistemi informatici. Quasi ogni lingua ha un tipo di dati a virgola mobile; computer da PC a supercomputer sono acceleratori virgola mobile; maggior parte dei compilatori saranno chiamati a compilare algoritmi in virgola mobile di volta in volta; e praticamente ogni sistema operativo deve rispondere alle eccezioni a virgola mobile come troppopieno. Questo articolo presenta un tutorial su quegli aspetti del floating-point che hanno un impatto diretto sui progettisti di sistemi informatici. Si inizia con sfondo sulla rappresentanza in virgola mobile e errore di arrotondamento, prosegue con la discussione dello standard IEEE in virgola mobile, e si conclude con numerosi esempi di come i costruttori di computer possono sostenere meglio floating-point.

     

...

     

Comprimendo infiniti numeri reali in un numero finito di bit richiede una rappresentazione approssimativa. Anche se esistono infiniti interi, nella maggior parte dei programmi il risultato di calcoli interi possono essere memorizzate in 32 bit. Al contrario, in un qualsiasi numero fisso di bit, la maggior parte dei calcoli con numeri reali produrranno quantità che non possono essere rappresentate esattamente usando che molti bit. Quindi il risultato di un calcolo in virgola mobile deve spesso essere arrotondato in modo da adattarsi di nuovo nella sua rappresentazione finita. Questo errore di arrotondamento è la caratteristica di virgola mobile computazione.

Altri suggerimenti

Doppia precisione non è esatta, quindi internamente 33,46,639 mila è effettivamente memorizzata come 33,466,389 mila

Edit: Come Richard detto, è dati punto, (memorizzato in binario in un insieme finito di bit) galleggianti quindi non è esattamente quello) ....

Era la vigilia di Capodanno alla fine del 1994. Andy Grove, CEO di Intel, è venuta fuori un grande anno, quello che con il processore Pentium coming out e di essere un grande successo. Così, ha camminato in un bar e ordinò un doppio colpo di Johnnie Walker Green Label.

Il barista servita in su e ha detto, "che sarà $ 20, signore."

Grove ha messo una banconota da venti dollari sul bancone, lo guardò per un momento, e disse: "mantenere il cambiamento".

http://en.wikipedia.org/wiki/Pentium_FDIV_bug

Il motivo è che 33,46,639 mila sarà rappresentato come qualcosa di poco inferiore a quel numero.

Moltiplicando per 1000000 vi darà 33.466.389,99,999999 millions.

Tipo di pressofusione utilizzando (int) sarà poi solo restituire la parte intera (33.466.389).

Se si desidera che il numero di "destra", prova a round () prima del tipo di getto.

Se stai chiedendo il motivo per cui non diventa 33466390, è perché doubles non hanno precisione infinita, e il numero non può essere espresso esattamente in binario.

Se si sostituisce l'double con un decimal ((int)(33.46639m * 1000000)), che sia pari a 33466390, perché decimals sono calcolate in base 10.

Poiché 33,46,639 mila non può essere espresso esattamente in un numero finito di cifre binarie. Il risultato effettivo di 33,46,639 mila * 1000000 è 33.466.389,9999999962747097015380859375. Il cast tronca a 33.466.389.

Il motivo che hai un risultato diverso è il fatto che è stato utilizzato un ' Cast '

(int)(33.46639 * 1000000) returns 33466389
^^^^^

per lanciare il risultato a un tipo di 'int' ... che sia arrotondato il tipo integrale quando moltiplicata insieme e poi convertito in 'int' .... non fare affidamento su virgola mobile di essere abbastanza accurate .... Skeet ha registrato un eccellente introduzione sul suo sito qui e qui ...

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