Przedstawiony jako liczba zmiennoprzecinkowa ma wykładnik równy 16 (tj. Wartość to czasy manekinów 2^16 lub 65536). Mantisse staje
123456.123456/65536 = 1.8837909462890625
Aby zmieścić się w 32-bitowym pływak The mantisse jest obcinana do 23 bitów, to teraz staje 1.883791
. Po pomnożeniu z powrotem przez 65536
staje się 123456.125
.
Zauważ 5
na trzeciej pozycji po przecinku dziesiętnym: procedura wyjściowa C++, której użyłeś, zaokrągla ją, sprawiając, że końcowa liczba wygląda jak 123456.13
.
EDIT Objaśnienie zaokrąglenia (uwaga Rick Regan)
Zaokrąglenie nastąpi pierwsze binarnie (24 bitów), dziesiętnie konwersji binarnej, a następnie dziesiętnym, printf
. Zapisana wartość to 1,1110001001000000001 x 2^16 = 1,8837909698486328125 x 2^16 = 123456.125. Wydrukowany jest jako 123456.13, ale tylko dlatego, że Visual C++ używa zaokrągleń "round half away from zero".
Rick ma także outstanding article on the subject.
Jeśli chciałbyś grać z innymi liczbami i ich reprezentacjami float, tutaj jest very useful IEEE-754 calculator.
dziękuję wszystkim za odpowiedzi. mam to teraz. Po prostu powinien za to kropić ponad liczbę cyfr, zamiast zaokrąglać go. – Kosmos