Zawsze wskazywałem ludzi w kierunku Harald Schmidt's online converter, wraz z Wikipedia IEEE754-1985 article z ładnymi zdjęciami.
Dla tych dwóch konkretnych wartości, można dostać (do 0,1):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 01111011 10011001100110011001101
| || || || || || +- 8388608
| || || || || |+--- 2097152
| || || || || +---- 1048576
| || || || |+------- 131072
| || || || +-------- 65536
| || || |+----------- 8192
| || || +------------ 4096
| || |+--------------- 512
| || +---------------- 256
| |+------------------- 32
| +-------------------- 16
+----------------------- 2
Znak jest dodatni, to całkiem proste.
Wykładnikiem jest 64+32+16+8+2+1 = 123 - 127 bias = -4
, więc mnożnik to 2-4
lub 1/16
.
Mantysa jest masywna. Składa się z 1
(ukrytej podstawy) plus (dla wszystkich tych bitów, z których każda jest warta 1/(2n)
jako n
rozpoczyna się od 1
i wzrasta w prawo), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}
.
Po dodaniu wszystkich tych elementów uzyskuje się 1.60000002384185791015625
.
Jeśli pomnożyć przez mnożnik, masz 0.100000001490116119384765625
, dlatego mówią, że nie mogą reprezentować 0.1
dokładnie jako pływaka IEEE 754 i dostarcza tyle okazji na SO dla osób odpowiadając "why doesn't 0.1 + 0.1 + 0.1 == 0.3?"
pytania -Type :-)
Przykład 0,5 jest znacznie łatwiejszy. Jest reprezentowane:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000
co oznacza, że jest niejawne bazowej 1
, a także inne dodatki (nie wszystkie Mantysa bitów zero).
Znak jest ponownie dodatni. Wykładnikiem jest 64+32+16+8+4+2 = 126 - 127 bias = -1
. Dlatego mnożnik to 2-1
, który jest 1/2
lub 0.5
.
Ostateczna wartość to 1
pomnożona przez 0.5
lub 0.5
. Voila!
Czasami łatwiej mi było o tym myśleć w kategoriach dziesiętnych.
Liczba 1.345 odpowiada
1 + 3/10 + 4/100 + 5/1000
lub:
-1 -2 -3
1 + 3*10 + 4*10 + 5*10
Podobnie reprezentacja IEEE 754 dla dziesiętnych 0.8125
jest:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000
z domniemanym podstawy 1, które jest równoważne plik binarny:
01111110-01111111
1.101 * 2
czyli
-1
(1 + 1/2 + 1/8) * 2 (no 1/4 since that bit is 0)
który przedstawia się następująco:
(8/8 + 4/8 + 1/8) * 1/2
i następnie postać:
13/8 * 1/2 = 0.8125