1 / 17

Operacje zmiennoprzecinkowe

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)

Download Presentation

Operacje zmiennoprzecinkowe

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Operacje zmiennoprzecinkowe Ernest Jamro Kat. Elektroniki AGH

  2. Reprezentacja liczby IEEE-754(32-bity) Eksponenta (cecha)-8bitów Mantysa (podstawa) – 23bity Znak (mantysy) – 1-bit (-1)Z x 2e-127 x (1.m) Z .......wartość bitu znaku,  E .....wartość eksponenty,  M......mantysa liczby IEEE-754(64-bity) Eksponenta (cecha)-11bitów Mantysa (podstawa) – 52bity Znak (mantysy) – 1-bit (-1)Z x 2e-1023 x (1.m)

  3. Reprezentacja Mantysy Liczby ujemne mantysy są reprezentowana w formacie: znak, moduł Dwie postacie mantysy: Znormalizowana 1,m1m2...mN Zawsze 1 na najbardziej znaczącej pozycji Jedynka nie jest kodowana (jest ukryta) 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. 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 111   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 Przykładowy, reprezentacja (32-bity)

  5. Operation Result n ÷ ± 0 ±  × ±  ±  ±  ÷ 0 ±  + + + (-  + - ) + (- ) ±0 ÷ ±0 NaN + - +  NaN ±  ÷ ±  NaN ±  × 0 NaN Operacje specjalne NaN – not a number

  6. Znak Eksponenta (e) Mantysa (m) Wartość 0 00..00 00..00 +0 0 00..00 00..0111..11 Dodatnia wartość nieznormalizowana0.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..0111..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 References

  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->Float Algorytm 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. Sprzętowa konwersja I 2 F

  10. Konwersja Float -> Int I= (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. Mnoż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) Operacja mnożenia i dzielenia

  12. Operacja dodawania Zał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 SASB) . Normalizacja wyniku Operacja odejmowania: Wystarczy zanegować znak SB Zobacz: 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łoprzecinkowe Bardzo 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 Modes • Sets the mode the filter uses to quantize numeric values when the values lie between representable • values 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.

More Related