Quando rappresentato come float, il numero ha un esponente di 16 (vale a dire il valore è il suo mantisse volte 2^16 o 65536). La mantissa diventa quindi
123456.123456/65536 = 1.8837909462890625
Per adattarsi in un galleggiante 32 bit, la mantissa viene troncato a 23 bit, per cui ora diventa 1.883791
. Quando viene moltiplicato per 65536
, diventa 123456.125
.
Nota il 5
nella terza posizione dopo il punto decimale: la routine di output del C++ che è stato utilizzato lo arrotonda, rendendo il numero finale simile a 123456.13
.
EDIT Spiegazione del raccordo: (commento di Rick Regan)
L'arrotondamento avviene prima in formato binario (a 24 bit), in decimale alla conversione binaria, e quindi in decimale, in printf
. Il valore memorizzato è 1.1110001001000000001 x 2^16 = 1.8837909698486328125 x 2^16 = 123456.125. Viene stampato come 123456.13, ma solo perché Visual C++ utilizza arrotondamenti "arrotondati a metà da zero".
Rick ha uno outstanding article on the subject, anche.
Se si desidera giocare con altri numeri e le loro rappresentazioni float, ecco un very useful IEEE-754 calculator.
grazie a tutti per le risposte. ho capito ora solo che dovrebbe cadere cifre troppo lunghe dopo il punto, invece di arrotondarlo. – Kosmos