Rozpatrzmy arytmetyki przenośne binary 16 a binary 32 o formacie opisanym w standardzie IEEE 754. Niech x będzie liczbą znormalizowaną o następującej reprezentacji bitowej w arytmetyce binary16
\(\displaystyle{ |s|c_{4}...c_{1}c_{0}|d_{1}...d_{}d_{10}|}\)
jaka jest reprezentacja bitowa tej samej liczby x w arytmetyce binary32?
jak rozwiązać to zadanie?
arytmetyka zmiennopozycyjna
-
- Użytkownik
- Posty: 348
- Rejestracja: 13 lut 2007, o 17:15
- Płeć: Mężczyzna
- Lokalizacja: warszawa
- Podziękował: 163 razy
arytmetyka zmiennopozycyjna
sprawdziłem to dla jakiejś liczby i chyba raczej będzie tak:
|s|c4...c0 111|d1...d10 0...0|
|s|c4...c0 111|d1...d10 0...0|
-
- Użytkownik
- Posty: 735
- Rejestracja: 7 lis 2005, o 23:56
- Płeć: Mężczyzna
- Lokalizacja: Łódź
- Podziękował: 2 razy
- Pomógł: 133 razy
arytmetyka zmiennopozycyjna
chodzi o kowencję Little Endian. Nie ma ona tu znaczenia, liczbę tę odczytujemy jako całe 32 bity a nie po 8 bitów (choć w pamięci rzeczywiście będzie to poprzestawiane)
-
- Użytkownik
- Posty: 971
- Rejestracja: 27 wrz 2005, o 22:56
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 11 razy
- Pomógł: 75 razy
arytmetyka zmiennopozycyjna
Musisz to zwyczajnie przeliczyć:
zapis: s|c|d = s|...c1c0|d0d1...
\(\displaystyle{ x = (-1)^s\cdot 2^{c-b}\cdot d}\)
wykładnik: w = c-b
Dla float32 bias: b = 127 = 2^7-1 = 0111111b; długość c wynosi 8 bitów: lc = 8;
a dla tego 16 bitowego masz: lc = 5, czyli b = 2^4 - 1 = 15 = 01111,
czyli w float mamy takie coś:
w = c-127 i to musi być równe w przypadku 16 bitowego: w' = c' - 15
w = w', czyli c' - 15 = c-127 => c = c' + 127 - 15 = c' + 112 = c' + 01110000b
czyli wychodzi że trzeba dodać tam po prostu 112 do cechy...
sprawdzimy:
x = 1.5 = 3/2 = 2*3/4 = 2^1*(1/2 + 1/4)
16: 0|1+15|3 = 0|10000|110...
32: 0|1+127|3 = 0|10000000|110..., czyli tu wypełniamy zerami.
[W maszynie będzie tak: 0|10000000|10... najstarszy bit mantysy nie jest zapisywany w float i double - ma zawsze wartość 1]
x = 3/32 = 2^-3 * (1/2+1/4)
16: 0|-3 + 15|3 = 0|01100|110...
32: 0|-3 + 127|3 = 0|01111100|110... tu już nie wypełniamy zerami.
nie ma tu prostego wypełniania... trzeba dodawać 112:
10000 = 16 => 16 + 112 = 128 = 10000000
01100 = 12 => 12 + 112 = 124 = 01111100
zapis: s|c|d = s|...c1c0|d0d1...
\(\displaystyle{ x = (-1)^s\cdot 2^{c-b}\cdot d}\)
wykładnik: w = c-b
Dla float32 bias: b = 127 = 2^7-1 = 0111111b; długość c wynosi 8 bitów: lc = 8;
a dla tego 16 bitowego masz: lc = 5, czyli b = 2^4 - 1 = 15 = 01111,
czyli w float mamy takie coś:
w = c-127 i to musi być równe w przypadku 16 bitowego: w' = c' - 15
w = w', czyli c' - 15 = c-127 => c = c' + 127 - 15 = c' + 112 = c' + 01110000b
czyli wychodzi że trzeba dodać tam po prostu 112 do cechy...
sprawdzimy:
x = 1.5 = 3/2 = 2*3/4 = 2^1*(1/2 + 1/4)
16: 0|1+15|3 = 0|10000|110...
32: 0|1+127|3 = 0|10000000|110..., czyli tu wypełniamy zerami.
[W maszynie będzie tak: 0|10000000|10... najstarszy bit mantysy nie jest zapisywany w float i double - ma zawsze wartość 1]
x = 3/32 = 2^-3 * (1/2+1/4)
16: 0|-3 + 15|3 = 0|01100|110...
32: 0|-3 + 127|3 = 0|01111100|110... tu już nie wypełniamy zerami.
nie ma tu prostego wypełniania... trzeba dodawać 112:
10000 = 16 => 16 + 112 = 128 = 10000000
01100 = 12 => 12 + 112 = 124 = 01111100