Operacje zmiennoprzecinkowe

17
Operacje zmiennoprzecinkowe Ernest Jamro Kat. Elektroniki AGH

description

Operacje zmiennoprzecinkowe. Ernest Jamro Kat. Elektroniki AGH. Reprezentacja liczby. IEEE-754 (32-bity) Eksponenta (cecha)-8bitów Mantysa (podstawa) – 23bity Znak (mantysy) – 1-bit. (-1) Z x 2 e-127 x (1. m) - PowerPoint PPT Presentation

Transcript of Operacje zmiennoprzecinkowe

Page 1: Operacje zmiennoprzecinkowe

Operacje zmiennoprzecinkowe

Ernest JamroKat. Elektroniki AGH

Page 2: Operacje zmiennoprzecinkowe

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)

Page 3: Operacje zmiennoprzecinkowe

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

Page 4: Operacje zmiennoprzecinkowe

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

Page 5: Operacje zmiennoprzecinkowe

5

Operacje specjalne

Operation Result n ÷ ± 0

± × ± ± ± ÷ 0 ±

+ + + (- + - ) + (- ) ±0 ÷ ±0 NaN + - + NaN

± ÷ ± NaN ± × 0 NaN

NaN – not a number

Page 6: Operacje zmiennoprzecinkowe

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

Page 7: Operacje zmiennoprzecinkowe

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)

Page 8: Operacje zmiennoprzecinkowe

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;

}

Page 9: Operacje zmiennoprzecinkowe

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

Page 10: Operacje zmiennoprzecinkowe

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

Page 11: Operacje zmiennoprzecinkowe

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)

Page 12: Operacje zmiennoprzecinkowe

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

Page 13: Operacje zmiennoprzecinkowe

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

Page 14: Operacje zmiennoprzecinkowe

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.

Page 15: Operacje zmiennoprzecinkowe

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)

Page 16: Operacje zmiennoprzecinkowe

16

Filtr w IIR Matlabie

Page 17: Operacje zmiennoprzecinkowe

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.