Post on 13-Mar-2016
description
Operacje zmiennoprzecinkowe
Ernest JamroKat. Elektroniki AGH
2
Reprezentacja liczby
Z 22 Mantysa 0 30 exp. 23 IEEE-754 (32-bity)
Eksponenta (cecha)-8bitów
Mantysa (podstawa) – 23bity
Znak (mantysy) – 1-bit
Z 51 Mantysa 0 62 exp. 52
IEEE-754 (64-bity)
Eksponenta (cecha)-11bitów
Mantysa (podstawa) – 52bity
Znak (mantysy) – 1-bit
(-1)Z x 2e-127 x (1.m)
Z .......wartość bitu znaku, E .....wartość eksponenty, M......mantysa liczby
(-1)Z x 2e-1023 x (1.m)
3
Reprezentacja Mantysy
1,m1m2...mN
Zawsze 1 na najbardziej znaczącej pozycji
Jedynka nie jest kodowana (jest ukryta)
N
i
iimM
1
20.1 0.20.1 M
Liczby ujemne mantysy są reprezentowana w formacie: znak, moduł
Dwie postacie mantysy:
Znormalizowana
Nieznormalizowana
0,m1m2...mN
Zero ukryte – domniema się zero dla eksponenty = 00..0 wtedy format liczby
(-1)Z x 2-b+1 x 0.m
4
Przykładowy, reprezentacja (32-bity)
znak eksponenta mantysa 1 bit 8 bits 23 bits
7/4 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-34.432175 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 0
-959818 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+nieskończon. 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
najmniejsza 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
największa 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-nieskonczon. 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
NaN 0 1 1 1 1 1 1 1 1 Chociaż jedna ‘1’
2-128** 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5
Operacje specjalne
Operation Result n ÷ ± 0
± × ± ± ± ÷ 0 ±
+ + + (- + - ) + (- ) ±0 ÷ ±0 NaN + - + NaN
± ÷ ± NaN ± × 0 NaN
NaN – not a number
6
Znak Eksponenta (e) Mantysa (m) Wartość0 00..00 00..00 +0 0 00..00 00..01
11..11 Dodatnia wartość nieznormalizowana
0.m × 2(-b+1) (b-przesunięcie eksponenty)
0 00..0111..10 XX..XX
Dodatnia znormalizowana wartość1.m × 2(e-b)
0 11..11 00..00 + nieskończoność
0 11..11 00..0101..11 SNaN (Signaling Not a Number)
0 11..11 10..0011..11 QNaN (Quiet Not a Number)
1 00..00 00..00 -0 1 00..00 00..01
11..11 Ujemna wartość nieznormalizowana
-0.m× 2(-b+1)
1 00..0111..10 XX..XX Wartość negatywna znormalizowana
-1.m × 2(e-b) 1 11..11 00..00 -nieskończoność
1 11..11 00..0101..11 SNaN
1 11..11 10..0011.11 QNaN
7
Konwersja Integer->Float•Dokonać konwersji do formatu znak - moduł
•Znaleźć najstarszą ‘1’ – w ten sposób określamy eksponentę
•Dokonać przesunięcia tak aby najstarsza ‘1’ była na pozycji pierwszego bitu po kropce– w ten sposób określamy mantysę
Algorytm sekwencyjny (wolny) - język C
I- liczba wejściowa dodatnia (tylko moduł)
if (I==0) { exp= 0; mantysa= 0; } // liczba zero
int sh= 0; // przesunięcie
while ( I & 0x8000000 == 0) // sprawdź najstarszy bit
{ sh++; I<<=1;}
exp= 127+31 - sh; // eksponenta
mantysa= I <<1; // mantysa zaczyna się od najstarszego bitu (pierwsza ‘1’ jest odrzucona)
8
Konwersja Integer->FloatAlgorytm szybki (zastosowany w sprzęcie)
I- liczba wejściowa dodatnia (tylko moduł)
int sh= 0; // przesunięcie
if (I & 0xFFFF0000 == 0) // sprawdź najstarsze 16-bitów
{ I<<= 16; sh|= 0x10; } // ewentualnie przesuń o 16 bitów
if (I & 0xFF000000 == 0) // sprawdź najstarsze 8 bitów
{ I<<= 8; sh|= 8; } // ewentualnie przesuń o 8 bitów
if (I & 0xF0000000 == 0) // sprawdź najstarsze 4 bitów
{ I<<= 4; sh|= 4; } // ewentualnie przesuń o 4 bity
if (I & 0xC0000000 == 0) // sprawdź najstarsze 2 bitów
{ I<<= 2; sh|= 2; } // ewentualnie przesuń o 2 bitów
if (I & 0x80000000 == 0) // sprawdź najstarszy bit
{ I<<= 1; sh|= 1; } // ewentualnie przesuń o 8 bitów
if (I & 0x8000000 == 0) { exp= 0; mantysa= 0; } // liczba zero (sprawdź tylko najstarszy bit)
else
{ mantysa= I<<1;
exp= 31+127-sh;
}
9
CECHA
31 16 15 0
1 0
16 16
0
31 24 23 0
32
24 8
0
1 0
31 9
30 24
31 30 0
31 30 29 0
31 28 27 0
28 4
0
1 0
30 2
0
1 0
32
32
32
31 1
0
1 0
32
32
16
32
2
32
4
32
8
32
1
D_FF
4xD
3xD
2xD
5xD
+158
23 9
8 0
31
Sprzętowa konwersja
I 2 F
10
Konwersja Float -> IntI= (1<<sizeof(Mantysa) | M; // dołożenie 1 na najstarszym bicie
I<<= Eksponenta – 127 – sizeof(Mantysa)
Uwaga wspomniana konwersja nie może być w prosty sposób wykonana dla formatu int 32 oraz float 64
11
Operacja mnożenia i dzieleniaMnożenie:
Y= A*B= ((-1)Sa * MA*2Ea-b) * ((-1)Sb * MB * 2Eb-b)
Y= (-1)Sa+Sb * MA*MB * 2Ea+Eb–2b (b – przesuniecie eksponenty)
SY= SA xor SB
MY= MA * MB (należy pamiętać o wiodących jedynkach. W niektórych przypadkach MY >=2.0 co wymaga dodatkowego przesunięcia o jeden bit w prawo)
EY= EA + EB – b (+1 – w przypadku dodatkowej normalizacji)
Dzielenie
Y= A/B = ((-1)Sa * MA*2Ea-b) / ((-1)Sb * MB * 2Eb-b
Y= (-1)Sa+Sb * (MA/MB) * 2Ea – Eb
SY= SA xor SB
MY= MA / MB – uwaga mantysa wymaga normalizacji (przesunięcia w lewo o k-bitów)
EY= EA – EB + b – k (k przesunięcia mantysy o k-bitów podczas normalizacji)
12
Operacja dodawaniaZałożenie EA >= EB (w przeciwnym wypadku zamienić argumenty)
Y= A+B= ((-1)Sa * MA*2Ea-b) + ((-1)Sb * MB * 2Eb-b
Y= (-1)Sa * (MA + ((-1)Sb+Sa MB)>>(EA-EB) ) * 2Ea-b
Wykonywanie operacje:
Porównanie EA i EB i ewentualne zamienienie argumentów
Przesunięcia MB o (EA-EB) bitów w prawo
Wykonanie operacji dodawania (lub odejmowania jeżeli SASB) .
Normalizacja wyniku
Operacja odejmowania:
Wystarczy zanegować znak SBZobacz:
http://tima-cmp.imag.fr/~guyot/Cours/Oparithm/english/Flottan.htm
13
Propagacja błędów
Operacja dodawania
AR= A + eR; AR – rzeczywista wartość A, A- wartość otrzymana
AR + BR = A + eA + B + eB (eA- błąd reprezentacji liczby AR)
AR + BR = (A+B) + eA + eB
eAB= (AR + BR) – (A+B) = eA + eB
propagacja błędu bezwzględnego, błąd ma szczególne znaczenie w przypadku kiedy (A+B) dużo mniejsze od A i B. Najgorszy przypadek wtedy kiedy A-B wtedy możliwe jest że eAB AR+BR
Operacja mnożenia
AR * BR = (A + eA) * (B + eB)= A*B + A*eB + B*eA + (eA*eB – można pominąć)
Następuje propagacja i sumowanie błędów (szczególne znaczenie ma błąd reprezentacji liczby mniejszej), natomiast nie następuje zwielokrotnienie błędu jak to może mieć miejsce w przypadku operacji dodawania
14
Zalety i wady reprezentacji zmiennoprzecinkowej
Operacje zmiennoprzecinkowe są zalecane tam gdzie wartości liczb mają bardzo różne wielkości (różne eksponenty).
Część znaczących bitów reprezentacji zmiennoprzecinkowej jest tracona na eksponentę, np. dla 32-bitowej reprezentacji jest to 8-bitów. Dlatego jeżeli liczby wejściowe nie różnią się o więcej niż o 8 bitów w eksponencie zaleca się stosować reprezentację stałoprzecinkową, w której każda liczba jest reprezentowana na 32-bitach.
Zaletą liczb zmiennoprzecinkowych jest to, że błąd względny reprezentacji jest stały.
Wada – operacje zmiennoprzecinkowe są bardziej skomplikowane i przez to zajmują więcej zasobów i są z reguły wolniej wykonywane. Ma to szczególne znaczenie w przypadku operacji dodawania.
15
Operacje stałoprzecinkoweBardzo często nie jest konieczne stosowanie operacji zmiennoprzecinkowych – można je zastąpić operacjami stałoprzecinkowymi czyli pośrednio operacjami na liczbach całkowitych
Często wynik operacji stałoprzecinkowych jest szybszy i dokładniejszy od wyniku operacji zmiennoprzecinkowych ponieważ nie jest tracona informacja na eksponentę
Reprezentacja stałoprzecinkowa
AR= A << EA AR- liczba rzeczywista, A- liczba całkowita, EA- stałe przesunięcie dla wszystkich operacji.
Przesunięcie EA nie jest uwzględniane podczas obliczeń a jedynie na samym początku i końcu obliczeń.
Przykład:
Y= A1*B1 + A2*B2 + C3*B3 Ai= Ari << EA; Bi= Bri << EB
YR= Y >> (EA + EB)
Wada: Konieczność pamiętania przesunięcia każdej operacji. Możliwość stosowania tylko wtedy kiedy przesunięcia EAi oraz EBi są podobnej wartość (nie różnią się o więcej niż około 10 bitów)
16
Filtr w IIR Matlabie
17
Rounding ModesSets the mode the filter uses to quantize numeric values when the values lie between representablevalues for the data format (word and fraction lengths).•ceil - Round toward positive infinity.•convergent - Round to the closest representable integer. Ties round to the nearest even stored integer. This is the least biased of the methods available in this software. E.g. 101.1000 110; 100.1000 100 ale 100.1001 101•round - Round toward nearest. Ties round toward negative infinity for negative numbers, and toward positive infinity for positive numbers.•zero/fix - Round toward zero.•floor - Round toward negative infinity.•nearest - Round toward nearest. Ties round toward positive infinity.