Upload
trinhnguyet
View
218
Download
2
Embed Size (px)
Citation preview
Reprezentacja informacji
Sposób reprezentacji informacji w systemie
Jak to się dzieje że w pamięci komputera można przechowywać teksty, obrazy, dźwięki i liczby?
Dzięki kodowaniu informacji.
Kodowanie informacji jest to przedstawienie informacji w postaci komunikatu zrozumiałego przez odbiorcę. Do kodowania używamy określonego zbioru, np.. cyfr, znaków, impulsów.
Reprezentacja znaków
Kod BCD
BCD (Binary Coded Decimal) – sposób zapisu liczb polegający na zakodowaniu kolejnych cyfr dziesiętnych liczby dwójkowo przy użyciu czterech bitów.
Każda cyfra liczby dziesiętnej jest oddzielnie kodowana dwójkowo w postaci odpowiedniego słowa. Cała liczba dziesiętna jest więc zakodowana dwójkowo w postaci odpowiedniego złożenia takich słów.
Liczba zapisana w kodzie BCD po zamianie na system szesnastkowy da się bezpośrednio odczytać jako liczba dziesiętna.
Kod BCD
9234(10) = 1001 0010 0011 0100 = 1001001000110100(BCD)
10000110000001110001(BCD)
1000 0110 0000 0111 0001 = 86071(10)
Kod BCD Kod BCD jest obecnie stosowany głównie:
w urządzeniach elektronicznych z wyświetlaczem cyfrowym (np. w kalkulatorach, miernikach cyfrowych)
w zastosowaniach finansowych informatyki (ujednoznacznia zapis części ułamkowych kwot i ułatwia dziesiętne zaokrąglanie).
Kod ASCIIASCII (American Standard Code for InformationInterchange)
Opracowany dla urządzeń dalekopisowych, później przyjęty dla komputerów
7-bitowy kod przyporządkowujący liczby z zakresu 0-127 literom (alfabetu angielskiego), cyfrom, znakom przestankowym i innym symbolom oraz poleceniom sterującym
litery, cyfry oraz inne znaki drukowane tworzą zbiór znaków ASCII - jest to 95 znaków o kodach 32-126
pozostałe 33 kody (0-31 i 127) to tzw. kody sterujące służące do sterowania urządzeniem odbierającym komunikat, np. drukarką czy terminalem
Kod ASCII
33 kody – 0-31 i 127
znaki niedrukowalne: sygnały dźwiękowe, białe znaki (tabulacja, spacja, znak końca wiersza, powrót na początek wiersza)
Kod ASCII – kody sterująceW systemie DOS/Windows każdy wiersz pliku zakończony jest parą znaków:
CR, kod ASCII - 13(10) = 0D(16) - powrót na początek wiersza
LF, kod ASCII - 10(10) = 0A(16) + przesunięcie o wiersz
w systemie Linux znakiem końca wiersza jest tylko:
LF, kod ASCII - 10(10) = 0A(16)
podczas przesyłania pliku tekstowego z systemu Linux do systemu DOS/Windows pojedynczy znak LF zamieniany jest automatycznie na parę znaków CR i LF
błędne przesłanie pliku tekstowego (w trybie binarnym) powoduje nieprawidłowe jego wyświetlanie
Kod ASCII – informacja tekstowa
Pierwszy wiersz pliku
Drugi wiersz pliku
Trzeci wiersz pliku
Kod ASCII – informacja tekstowa
Kod ASCII w wersji podstawowej jest 7-bitowy
Większość komputerów pracuje na 8-bitowych bajtach
Dodatkowy bit jest wykorzystywany do powiększenia zbioru kodowanych znaków
Powstało wiele różnych rozszerzeń ASCII wykorzystujących ósmy bit, nazywanych stronami kodowymi
Kod ASCII – strony kodowe
Strona kodowa - sposób na przypisanie poszczególnym kodom binarnym rożnych znaków pisarskich
Różne strony kodowe mogą przyjąć odmienne znaki dla tego samego kodu
Różne strony kodowe mogą różnić się wyborem znaków
Duża liczba dostępnych stron kodowych wynika z faktu, że na 8 bitach można zakodować tylko 256 różnych
znaków, co jest niewystarczające do zmieszczenia w jednym zestawie znaków wszystkich alfabetów
Kod ASCII – strony kodowe ISO/IEC 8859
Zestaw standardów służących do kodowania znaków za pomocą 8 bitów
Standardy te zostały utworzone przez European ComputerManufactures’ Association (ECMA) w połowie lat osiemdziesiątych, a następnie uznane przez ISO
Wszystkie zestawy ISO 8859 mają znaki 0-127 takie same jak ASCII
Pozycjom 128-159 przypisane są dodatkowe kody sterujące, tzw. C1 (faktycznie są nieużywane).
Standardy ISO 8859ISO 8859-1 (Latin-1) - alfabet łaciński dla dla Europy zachodniej ISO 8859-2 (Latin-2) – alfabet łaciński dla Europy środkowej i
wschodniej, również odpowiednia Polska NormaISO 8859-3 (Latin-3) – alfabet łaciński dla Europy południowej ISO 8859-4 (Latin-4) – alfabet łaciński dla Europy północnej ISO 8859-5 (Cyrillic) – alfabet dla cyrylicyISO 8859-6 (Arabic) - dla alfabetu arabskiegoISO 8859-7 (Greek) - dla alfabetu greckiegoISO 8859-8 (Hebrew) - dla alfabetu hebrajskiegoISO 8859-9 (Latin-5) ISO 8859-10 (Latin-6) ISO 8859-11 (Thai) - dla alfabetu tajskiegoISO 8859-13 (Latin-7) ISO 8859-14 (Latin-8) ISO 8859-15 (Latin-9) - z ISO 8859-1 usunięto kilka rzadko używanych
znaków i wprowadzono znak Euro oraz litery Š, š, Ž, ž, Œ, œ oraz ŸISO 8859-16 (Latin-10) – alfabet łaciński dla Europy środkowej -
zmodyfikowany ISO 8859-2 ze znakiem Euro i dodatkowymi literami dla kilku języków.
Kod ISO/IEC 8859-1
kodowanie używane w Amerykach, Europie Zachodniej, Oceanii i większej części Afryki
dostępne języki: albański, angielski, baskijski, duński, estoński, fiński, francuski, hiszpański, irlandzki, islandzki, kataloński, łaciński, niderlandzki, niemiecki, norweski, portugalski, retoromański, szkocki, szwedzki, włoski
składa się ze 191 znaków łacińskiego pisma
po rozszerzeniu o dodatkowe przypisania znaków jest podstawą dla dwóch mapowań znaków ISO-8859-1 i Windows-1252
Kod ISO/IEC 8859-2
dostępne języki: bośniacki, chorwacki, czeski, węgierski, polski, rumuński, serbski, serbsko-chorwacki, słowacki, słoweński, górno- i dolnołużycki
możliwość przedstawienia znaków w języku niemieckim i angielskim
składa się ze 191 znaków łacińskiego pisma zapisywanych na 8-bitach
kody z przedziałów 00(16)-1F(16) oraz 7F(16)-9F(16) nie sąużywane w ISO-8859-2
kodowanie to jest zgodne z Polską Normą
ISO 8859-1 i 8859-2 – porównanie
Kod EBCDIC
EBCDIC - Extended Binary Coded Decimal InterchangeCode
8-bitowe kodowanie znaków stworzone jako rozszerzenie kodowania BCD
umożliwia zapisanie do 256 różnych symboli
pojedynczy znak zapisywany jest na 8-bitach podzielonych na dwie części
pierwsze 4 bity oznaczają grupę do jakiej dany znak należy
ostatnie 4 bity identyfikują konkretny znak
Kod EBCDIC
kodowanie EBCDIC było używane głównie w systemach IBM (komputery: z/OS, VM, OS/390, systemy operacyjne: OS/400, i5/OS) w latach 60-tych XX wieku
ułatwiało wprowadzanie danych do komputera przy użyciu kart perforowanych
kody EBCDIC nie są zgodne z ASCII
EBCDIC występowało w wielu wersjach, odmiennych dla różnych państw
większość stron kodowych EBCDIC dopuszczała stosowanie tylko dwóch języków (angielski + dodatkowy)
Windows 1250
Strona kodowa używana przez system Microsoft Windows do reprezentacji tekstów w językach środkowoeuropejskich używających alfabetu łacińskiego, takich jak albański, chorwacki, czeski, polski, rumuński, słowacki, węgierski
jest podobny do ISO 8859-2 — posiada wszystkie jego drukowalne znaki (a także kilka dodatkowych), lecz kilka z nich zajmuje inne miejsca
Windows 1250 i ISO 8859-2
Kodowanie polskich znaków
Tekst zapisany w standardzie ISO – 8859-2
Tekst wyświetlony w edytorze systemu Windows (Windows – 1250)
Standardy kodowania polskich znakówW Polsce stosowanych było ok. 20 „standardów” kodowania polskich liter (http://www.ogonki.agh.edu.pl)
Próby wprowadzania standardu:Mazovia - promowany przez społeczność informatyczną w Polsce (nie był pełną stroną kodową, ale określał sposób kodowania polskich liter)
IBM-Latin-2 (CP-852) - stosowany w DOS, OS/2 i części systemu Windows
CP-1250 (Windows-1250) – stosowany w MS Windows PL
ISO-Latin-2 (ISO 8859-2) - stosowany w Internecie Standard ISO 8859-2 jest zgodny z Polską Normą PN-93 T-42118
Unicode
Komputerowy zestaw znaków mający w zamierzeniu obejmować wszystkie pisma i inne znaki (symbole muzyczne, techniczne, wymowy) używane na świecie
Unicode przypisuje unikalny numer każdemu znakowi, niezależnie od używanej platformy, programu czy języka
Definiowany jest przez dwa standardy, w których znaki są identyczne: Unicode i ISO/IEC 10646
Standard Unicode zaimplementowany został w wielu nowych technologiach, np. XML, Java, Microsoft .NET Framework, nowe systemy operacyjne
Podstawowe właściwości Unicode
• Jednoznaczność – każdemu znakowi zakodowanemu za pomocą Unicode odpowiada zawsze ta sama wartośćliczbowa i odwrotnie.
• Uniwersalność – dostępne znaki obejmują wszystkie powszechnie używane języki i symbole.
• 16-bitowa reprezentacja – każdy znak reprezentowany jest w postaci 16-bitowej liczby, czyli można zakodować216=65536 różnych znaków
• Efektywność – ułatwienie manipulowania tekstami, gdyżidentyfikacja znaku nie zależy od sekwencji sterujących czy znaków następujących bądź poprzedzających
Standardy wewnątrz UnicodeStandard Unicode definiuje kody numeryczne przypisane poszczególnym znakom, nie określa natomiast sposobu bajtowego kodowania znaków
Kodowanie określa sposób w jaki znaki ze zbioru mają byćzapisane w postaci binarnej
Stosowane metody kodowania: UCS - Universal Character SetUTF - Unicode Transformation Format
Niektóre z metod kodowania:UTF-8 - kodowanie 8-bitowe ze zmienną długością kodowania, zgodne z ASCIIUTF-16 - kodowanie 16-bitowe ze zmienną długością kodowaniaUTF-32/UCS-4 - kodowanie 32-bitoweUTF-EBCDIC - kodowanie 8-bitowe ze zmienną długością kodowania, kompatybilne z EBCDIC (nie jest częścią standardu Unicode)
Standardy wewnątrz Unicode
• UTF - 8 - unikod ośmiobitowym, Pierwsze 128 znaków pokrywa się z tablicą ASCII i jest zapisywana za pomocąjednego bajta, natomiast znaki dodatkowe (np. polskie literki) są zapisywane za pomocą specjalnych kilkubajtowych sekwencji.
• UTF -16 - kodowaniem dwubajtowym. Każdemu znakowi odpowiadają dwa bajty.
• UTF -32 - Pewnym problemem mogą być języki ideograficzne, na przykład chiński liczący tysiące znaków. Problemy takie ostatecznie rozwiązuje kodowanie czterobajtowe UTF-32 (cztery bajty dają 232 = 4 miliardy kombinacji).
Kod UnicodeRozwijany jest przez konsorcjum, w skład którego wchodzą firmy komputerowe, producenci oprogramowania oraz grupy użytkowników - http://www.unicode.org
Strona polska: http://www.unikod.pl
Pierwsza wersja: Unicode 1.0 (październik 1991)
Ostatnia wersja: Unicode 5.1.0 (4 kwietnia 2008)
Reprezentacja liczb
Reprezentacja liczb
Stałoprzecinkowabez znakuze znakiem
Zmiennoprzecinkowapojedynczej precyzjipodwójnej precyzjirozszerzonej precyzji
Liczby naturalne
Przechowywane są dokładnie tak, jak zapisalibyśmy je w systemie dwójkowym. Każdy bit stanowi pojedynczą cyfręw tym systemie.
Zapis binarny prosty pozwala za pomocą n cyfr zapisywaćliczby z zakresu: 0 ≤ L10 ≤ 2n – 1
1 bajt to 28 kombinacji, czyli zakres 0-255
2 bajty to 216 kombinacji, czyli zakres 0-65536,
4 bajty to ponad 4 miliardy kombinacji
Dodawanie liczb binarnychDo wykonywania dodawania niezbędna jest znajomośćtabliczki dodawania, czyli wyników sumowania każdej cyfry z każdą inną:
0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 10
1111=1510+ 0001= 11010000=1610
1010=1010+ 1010=101010100=2010
1100=1210+ 0011= 310
1111=1510
0101= 510+ 0110= 610
1011=1110
Dodawanie liczb binarnych -zadania
Zsumować liczby binarne:
• 1111001(2) oraz 10010(2).
• 01111111(2) oraz 1(2)
Dodawanie liczb binarnych -problem
• W pamięci komputera liczby binarne przechowywane sąw postaci ustalonej ilości bitów (np. 8, 16, 32 bity).
• Jeśli wynik sumowania np. liczb 8 bitowych jest większy niż 8 bitów, to najstarszy bit (dziewiąty bit) zostanie utracony.
• Sytuacja taka nazywa się nadmiarem (ang. overflow) i występuje zawsze, gdy wynik operacji arytmetycznej jest większy niż górny zakres danego formatu liczb binarnych (np. dla 8 bitów wynik większy od 28 - 1, czyli większy od 255):
11111111(2) + 00000001(2) = 1|00000000(2) (255 + 1 = 0)
Odejmowanie liczb binarnych
Przy odejmowaniu korzystamy z tabliczki odejmowania:0 - 0 = 00 - 1 = 1 i pożyczka do następnej pozycji1 - 0 = 11 - 1 = 0
Pożyczka oznacza konieczność odjęcia 1 od wyniku odejmowania cyfr w następnej kolumnie. 1101110(2) - 1111(2) = 1011111(2) (110(10) - 15(10) = 95(10)).
111111101110
- 00011111011111
111101110
- 111111
11101110
- 11111
Odejmowanie liczb binarnych -zadania
Odjąć liczby binarne:
• 10000000(2) - 0000001 (2) = ???
• 10101010(2) - 01010101(2) = ???
Odejmowanie liczb binarnych –problem
• Jeśli od liczby większej odejmiemy mniejszą, to wynik będzie ujemny.
1111111100000000
- 0000000111111111
• Otrzymujemy same jedynki, a pożyczka nigdy nie zanika.
• Sytuacja taka nazywa się niedomiarem (ang. underflow) i występuje zawsze, gdy wynik operacji arytmetycznej jest mniejszy od dolnego zakresu formatu liczb binarnych (dla naturalnego kodu dwójkowego wynik mniejszy od zera).
Liczby całkowite
Jak kodowany jest znak liczby?
Istnieją trzy główne sposoby kodowania liczb ze znakiem:
kod ZNAK-MODUŁ,
kod U1,
kod U2.
Kod ZM
Kod znak-moduł występuje też pod nazwami: ZM, Z-M, SM (Signed Magnitude), S+M
W kodzie ZM:
Najstarszy bit liczby jest bitem znaku
wszystkie bity liczby poza najstarszym mają takie same znaczenie jak w kodzie binarnym
Jeśli przyjmiemy do zapisu liczb format całkowity n-bitowy, to liczby w kodzie znak-moduł mają następującą postać:
cn-1 cn-2 cn-3 ... c2 c1 c0
znak moduł
Kod ZMWartość n-bitowej, całkowitej liczby w kodzie ZM obliczamy wg wzoru:
LZM = (-1)bit znaku x moduł liczby
Rozpisując poszczególne bity otrzymujemy:
bn-1bn-2...b2b1b0 = (-1)bn-1 (bn-22n-2 + ... + b222 + b121 + b020)
gdzieb - bit, cyfra dwójkowa 0 lub 1, n - liczba bitów w zapisie liczby
Bit znaku: 0 – liczba dodatnia, 1 – liczba ujemna
Zmiana liczby dziesiętnej na kod ZM
Przykłady
10110111(ZM) = (-1)1 x (25 + 24 + 22 + 21 + 20)= - (32 + 16 + 4 + 2 + 1)= - 55(10)
ZadanieObliczyć wartość dziesiętną liczby 00011111(ZM).
Przeliczanie liczb dziesiętnych na zapis ZM
1. Jeśli liczba jest dodatnia, to bit znaku ma wartość 0. W przeciwnym razie bit znaku ma wartość 1.
2. Obliczamy wartość absolutną liczby, czyli jej moduł.
3. Wyznaczamy bity modułu przeliczając liczbę dziesiętną na zapis dwójkowy.
4. Otrzymane bity modułu uzupełniamy w miarę potrzeby bitami o wartości 0, aby otrzymać ustaloną w formacie liczbę bitów dla modułu.
5. Do bitów modułu dodajemy bit znaku i otrzymujemy zapis ZM.
Przeliczanie liczb dziesiętnych na zapis ZM - przykład
1. Zmieniamy liczbę dodatnią 93Zmieniamy na liczbę binarną: 9310 = 1011101ZM
Dodajemy bit znaku: 9310 = 01011101ZM
2. Zmieniamy liczbę ujemną -93Zmieniamy moduł liczby na liczbę binarną: |-9310| = =9310 = 1011101ZM
Dodajemy bit znaku: 9310 = 11011101ZM
Przeliczanie liczb dziesiętnych na zapis ZM – zadanie
Przedstawić wartość -69 w 8-bitowym kodzie ZM.
Rozw. -69(10) = 11000101(ZM)
Zakres liczb w zapisie ZM
Zadanie polega na znalezieniu najmniejszej i największej wartości liczby, którą da się przedstawić w danym zapisie ZM.
Łatwo zauważyć, że w obu przypadkach moduł musi miećwartość maksymalną, a bit znaku 1 dla wartości najmniejszej i 0 dla wartości największej.
Zakres n bitowej liczby w kodzie ZM wynosi
Z(ZM) = <-2n-1 + 1, 2n-1 - 1>
Zapis ZM – wady
Koncepcyjnie prosty, lecz stwarzał poważne problemy przy wykonywaniu operacji arytmetycznych
Niejednoznaczność!!! - wartość 0 posada dwa słowa kodowe: 0000 oraz 1000.
Bit znakowy posiada zupełnie inne znaczenie od pozostałych bitów i nie uczestniczy bezpośrednio w operacjach arytmetycznych.
System uzupełnień do 1 – U1
U1 (ang. 1C - One's Complement) - wszystkie bity zapisu liczby posiadają swoje wagi
Najstarszy bit jest bitem znaku i ma wagę równą (-2n-1+1), gdzie n oznacza ilość bitów w zapisie liczby.
Pozostałe bity posiadają wagi takie jak w systemie binarnym.
b0
b1b2...bn-3bn-2bn-1Cyfra
2021222n-32n-2-2n-1+1Waga
Wartość dziesiętna liczby w zapisie U1
Wartość liczby U1 obliczamy zgodnie z poznanymi zasadami -cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny:
bn-1bn-2bn-3...b2b1b0 (U1) = bn-1(-2n-1+1) + bn-22n-2 + bn-32n-3 + ... + b222 + b121 + b020
gdzieb - bit, cyfra dwójkowa 0 lub 1n - liczba bitów w zapisie liczby
Najstarszy bit jest bitem znaku: 0 – liczba dodatnia, 1 – liczba ujemna
Cechy charakterystyczne kodu U1
• Wartość 0 posada dwa słowa kodowe: 0000 oraz 1111.
• Liczba przeciwna zawsze powstaje w kodzie U1 przez negację wszystkich bitów:
1(10) = 0001(U1) (-1)(10) = 1110(U1)5(10) = 0101(U1) (-5)(10) = 1010(U1)7(10) = 0111(U1) (-7)(10) = 1000(U1)
Zasada ta obowiązuje dla kodów U1 o dowolnej długości.
Przeliczanie liczb dziesiętnych na zapis U1
1. Jeśli liczba jest dodatnia, znajdujemy jej reprezentację w naturalnym kodzie binarnym i uzupełniamy bitami o wartości 0 do uzyskania zadanej liczby bitów wymaganej przez przyjęty format zapisu U1.
2. Przykład: Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej 76.
• Liczba 76 jest dodatnia, zatem wyznaczamy jej zapis w naturalnym systemie dwójkowym: 76(10) = 1001100(2)
• Otrzymaną liczbę dwójkową uzupełniamy bitami o wartości 0 do długości formatu otrzymując:
76(10) = 01001100(U1).
Przeliczanie liczb dziesiętnych na U1Jeśli liczba jest ujemna, to wartość liczby możemy wyznaczyć:
Wariant 1. Jeśli liczba jest ujemna, obliczamy jej moduł. Moduł przedstawiamy w naturalnym systemie dwójkowym uzupełniając go bitami o wartości 0 do długości przyjętego formatu U1. Następnie wszystkie bity zamieniamy na przeciwne i w wyniku otrzymujemy zapis U1.
Wariant 2: Wyznaczamy wartość 2n - 1 + liczba, gdzie n oznacza liczbę bitów w przyjętym formacie U1. Wartość tę kodujemy w naturalnym systemie dwójkowym i otrzymujemy kod U1 liczby wyjściowej.
Przeliczanie liczb dziesiętnych na zapis U1 – przykład
Przykład – Wariant 1
Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej -113
1. Liczba -113 jest ujemna. Jej moduł wynosi 113. Wyznaczamy zapis dwójkowy modułu: 113(10) = 1110001(2)
2. Otrzymany zapis uzupełniamy bitami 0 do długości 8 bitów.
3. Następnie negujemy wszystkie bity i otrzymujemy w ten sposób zapis U1 liczby -113:
-113(10) = NOT 01110001 = 10001110(U1).
Przeliczanie liczb dziesiętnych na zapis U1 – przykład
Przykład – Wariant 2
Wyznaczyć 8-mio bitowy zapis U1 liczby dziesiętnej -113
1. Obliczamy: 28 - 1 - 113 = 256 - 1 - 113 = 142
2. Otrzymany wynik kodujemy w systemie dwójkowym i otrzymujemy kod U1 liczby -113:
142(10) = 10001110(2), czyli -113(10) = 10001110(U1).
Przeliczanie liczb dziesiętnych na zapis U1 – zadanie
Wyznaczyć 16 bitowy zapis U1 liczbydziesiętnej -4521
Kod U1 - wady
W systemie U1 wykonywanie operacji arytmetycznych wciąż wymaga dodatkowych założeń
Przy dodawaniu do wyniku należało dodać przeniesienie poza bit znaku, aby otrzymać poprawny wynik.
Kod uzupełnień do 2 – U2
zmieniamy wagę bitu znakowego z -2n-1 + 1 na -2n - 1, gdzie n oznacza ilość bitów w formacie kodu.
Wagi stają się teraz jednorodne - bit znakowy posiada wagę ujemną, lecz o wartości bezwzględnej takiej samej jak w systemie binarnym.
Nowy kod nosi nazwę uzupełnień do podstawy 2 lub w skrócie U2 (ang. 2C - Two's Complement).
Wartość dziesiętna liczby w U2
Wartość liczby U2 obliczamy następująco:
cyfry mnożymy przez wagi pozycji, na których się znajdują i dodajemy otrzymane iloczyny. Waga bitu znakowego jest ujemna.
bn-1bn-2bn-3...b2b1b0 (U2) = bn-1(-2n-1) + bn-22n-2 + bn-32n-3 + ... + b222 + b121 + b020
gdzieb - bit, cyfra dwójkowa 0 lub 1n - liczba bitów w zapisie liczby
Wartość dziesiętna liczby w U2
Jeśli bit znaku jest równy 0, to liczba jest dodatnia i resztęzapisu możemy potraktować jak liczbę w systemie dwójkowym.
Przykład01101011(U2) = 64 + 32 + 8 + 2 + 1 = 107(10).
Wartość dziesiętna liczby w U2
• Jeśli bit znaku ustawiony jest na 1, to liczba ma wartośćujemną.
• Bit znaku ma wagę (-2n-1), gdzie n oznacza liczbę bitów w wybranym formacie U2.
• Reszta bitów jest zwykłą liczbą w naturalnym kodzie dwójkowym.
• Wagę bitu znakowego i wartość pozostałych bitów sumujemy otrzymując wartość liczby U2:
Przykład
11101011(U2) = (-27) +64+32+8+2+1 = -128 + 107 = (-21)(10).
Liczba przeciwna do danej liczby U2
1. Przejść do pierwszego od prawej strony bitu zapisu liczby.
2. Do wyniku przepisać kolejne bity 0, aż do napotkania bitu o wartości 1, który również przepisać.
3. Wszystkie pozostałe bity przepisać zmieniając ich wartość na przeciwną.
Liczba przeciwna do danej liczby U2
Znaleźć liczbę przeciwną w kodzie U2 do danej liczby 1100100010111010111010010100001000000(U2).
• Analizę liczby rozpoczynamy ostatniej cyfry zapisu liczby. Przesuwamy się w lewą stronę. Do wyniku przepisujemy wszystkie kolejne bity o wartości 0, aż do napotkania bitu 1.
1100100010111010111010010100001000000
• Napotkany bit 1 również przepisujemy do wyniku bez zmian:
1100100010111010111010010100001000000
• Pozostałe bity przepisujemy zmieniając ich stan na przeciwny. To wszystko.
Liczba przeciwna :0011011101000101000101101011111000000
Liczba przeciwna do danej liczby U2 – zadanie
Wyznaczyć liczbę przeciwną w kodzie U2 do liczby 01101110(U2).
Aby się przekonać czy wyliczona została poprawna wartość należy wyliczyć wartości dziesiętne obu liczb
Przeliczanie dodatnich liczb dziesiętnych na zapis U2
Znajdujemy reprezentację dwójkową danej wartości liczbowej,
Uzupełniamy ją bitami 0 do długości formatu kodu U2.
Przykład
Wyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej 27(10).
27(10) = 16 + 8 + 2 + 1 = 11011(2) = 00011011(U2).
Przeliczanie ujemnych liczb dziesiętnych na zapis U2
Jeśli do liczby 2n (n - ilość bitów w formacie U2) dodamy przetwarzaną liczbę dziesiętną, to w wyniku otrzymamy wartość kodu dwójkowego równoważnego bitowo (tzn. o takiej samej postaci) kodowi U2 przetwarzanej liczby.Wynik dodawania zapisujemy w postaci kodu binarnego
PrzykładWyznaczyć 8-mio bitowy kod U2 dla liczby dziesiętnej -45(10).
28 + (-45) = 256 - 45 = 211 = 11010011(2).Stąd (-45)(10) = 11010011(U2)
Reprezentacja liczb ze znakiem –porównanie kodów
Porównanie interpretacji wartości słów kodu binarnego w różnych systemach zapisu liczb ze znakiem
Liczby rzeczywiste
• Podejście stałoprzecinkowe – zakładamy, że przecinek jest za prawym skrajnym (najmłodszym bitem)
• Dla liczb całkowitych w zapisie binarnym otrzymujemy zawsze dokładne wartości
• Kodowanie liczb rzeczywistych obarczone jest błędem
Obliczanie wartości liczby stałoprzecinkowej
Zapis pozycyjny można w prosty sposób rozszerzyć na liczby ułamkowe wprowadzając pozycje o wagach ułamkowych.
Częśćułamkowa
Częśćcałkowita
-5-4-3-2-10123Numery pozycji
41928,9753Cyfry zapisu
10-510-410-310-210-1100101102103Wagi pozycji
System pozycyjno-wagowy
P - podstawa systemua – kolejne cyfry w liczbiei – indeks kolejnych cyfr
Liczbę stałoprzecinkową L w systemie pozycyjnym o podstawie (bazie) r zapisujemy w postaci:
(an-1…a1a0a-1…a-m)r
Unikalną reprezentacją liczby o wartości L jest zbiór cyfr {an-1,…,a1,a0,a-1, …, a-m} takich, że
ni
ii m
L a P=
=∑
Obliczanie dziesiętnej wartości liczby stałoprzecinkowej - przykład
Obliczyć wartość liczby stałoprzecinkowej 213,132(4).
213,132(4) = 2 x 42 + 1 x 41 + 3 x 40 + 1 x 4-1 + 3 x 4-2 + 2 x 4-3
= 2 x 16 + 1 x 4 + 3 x 1 + 1 x 1/4 + 3 x 1/16 + 2 x 1/64= 32 + 4 + 3 + 1/4 + 3/16 + 2/64= 39 + 16/64 + 12/64 + 2/64= 39 30/64
Obliczanie dziesiętnej wartości liczby stałoprzecinkowej - zadanie
Obliczyć wartość liczby stałoprzecinkowej 537,462(8).
Uproszczenie
Część ułamkową potraktujemy jako liczbę całkowitą, obliczymy jej wartość i pomnożymy ją przez wagę ostatniej cyfry zapisu stałoprzecinkowego.
Przykład: Oblicz wartość liczby stałoprzecinkowej 0,4231(5).
5-4 =1/625.
4231(5) = 4 x 53 + 2 x 52 + 3 x 51 + 1 x 50 = 4 x 125 + 2 x 25 + 3 x 5 + 1 x 1 = 500 + 50 + 15 + 1 = 566
Zatem 0,4231(5) = 566 x 1/625 = 566/625.
Uproszczenie
Przykład: oblicz wartość liczby stałoprzecinkowej 0,4231(5).
0,4231(5) = 0 x 50 + 4 x 5-1 + 2 x 5-2 + 3 x 5-3 + 1 x 5-4
= 0 x 1 + 4 x 1/5 + 2 x 1/25 + 3 x 1/125 + 1 x 1/625
= 0 + 4/5 + 2/25 + 3/125 + 1/625 = 500/625 + 50/625 + 15/625 + 1/625
= 566/625.
Algorytm Hornera obliczania wartości liczby stałoprzecinkowej
n - liczba cyfr w części całkowitejm - liczba cyfr w części ułamkowejp - podstawa systemu pozycyjnego, w którym jest zapisana
liczbaci - cyfra stojąca na i-tej pozycji. Pozycja o numerze 0 jest
pierwszą pozycją od strony prawej.w - obliczana wartość liczby
1. w ← 0 2. i ← n - 1 3. w ← ci + w x p 4. jeśli i = -m, to w ← w x p-m i kończymy5. i ← i - 1 6. wróć do punktu 3
Algorytm Hornera - liczba stałoprzecinkowa - przykład
Obliczyć przy pomocy algorytmu Hornera wartość dziesiętnąliczby 237,745 zapisanej w systemie pozycyjnym o podstawie p=8.
w ← 0w ← 2 + 0 x 8 = 2w ← 3 + 2 x 8 = 19w ← 7 + 19 x 8 = 159--------------------------------------------------w ← 7 + 159 x 8 = 1279 (od tego momentu występują
cyfry części ułamkowej)w ← 4 + 1279 x 8 = 10236w ← 5 + 10236 x 8 = 81893 (ostatnia cyfra, kończymy)
w ← 81893 x 1/512 = 159 485/512 = 159,947265625
Znajdowanie rozwinięcia liczby stałoprzecinkowej o podstawie p –przykładZnaleźć rozwinięcie liczby 12 8/9 na system trójkowy z dokładnością do dwóch miejsc po przecinku.
w ← 12 8/9 x 32 = 12 8/9 x 9 = 116 (mnożymy przez podstawępodniesioną do odpowiedniej potęgi)
w ← 116 / 3 = 38 i reszta 2w ← 38 / 3 = 12 i reszta 2w ← 12 / 3 = 4 i reszta 0w ← 4 / 3 = 1 i reszta 1w ← 1 / 3 = 0 i reszta 1 (koniec)
Otrzymaliśmy kolejne cyfry 11022. Dwie ostatnie cyfry umieszczamy po przecinku. Ostatecznie:12 8/9 = 110,22(3)
Znajdowanie rozwinięcia liczby stałoprzecinkowej o podstawie p –
zadanie
Znaleźć rozwinięcie liczby 1/10 na system dwójkowy z dokładnością do 8 miejsc po przecinku.
Podpowiedź:
w ← 1/10 x 28 = 1/10 x 256 = 256/10 = 26 (zaokrąglamy do najbliższej wartości całkowitej)
26 / 2 = 13 i reszta 013 / 2 = …
Wady liczb stałoprzecinkowych
• nie możemy prosto zapisywać na niewielkiej liczbie bajtów bardzo dużych i bardzo małych liczb
• jeśli chcemy rozszerzyć zakres i liczbę miejsc po przecinku musimy używać bardzo dużej liczby bajtów
• trudny do oszacowania błąd obliczeń
Zapis zmiennoprzecinkowy liczby rzeczywistej
Zapis bardzo dużych lub bardzo małych liczb w normalnej notacji pozycyjnej jest niewygodny ponieważ wymaga dużej ilości cyfr, np.
dwanaście bilionów: 12 000 000 000 000
trzydzieści trylionów: 30 000 000 000 000 000 000
jedna bilionowa: 0,000 000 000 001
Zapis zmiennoprzecinkowy liczby rzeczywistej
Znacznie prostsze jest przedstawienie powyższych liczb w postaci zmiennoprzecinkowej (ang. floating point numbers)
12 000 000 000 000 = 1,2x1013
30 000 000 000 000 000 000 = 3,0x1019
0,000 000 000 001 = 1,0x10-12
Zapis zmiennoprzecinkowy: postać wykładnicza, notacja naukowa
Zapis zmiennoprzecinkowy
Liczba zapisana w systemie zmiennoprzecinkowym składa się z dwóch części:
liczby stałoprzecinkowej, której wartość bezwzględna jest mniejsza od wartości podstawy systemu pozycyjnego (dokładność)
podstawy podniesionej do pewnej potęgi zwanej wykładnikiem lub cechą (zakres)
Zapis zmiennoprzecinkowy
L = s x m x pc
s – znak liczby ( 1 lub -1)m – mantysa (liczba ułamkowa),p – podstawa systemu, c – wykładnik potęgowy, czyli cecha (liczba całkowita)
Zapis zmiennoprzecinkowy Położenie przecinka w mantysie nie jest ustalone i może siędowolnie zmieniać.
Poniższe zapisy oznaczają tę samą liczbę:
325 x 1020 = 32,5 x 1021 = 3,25 x 1022 = 0,0325 x 1024, itd.
Zmiana położenia przecinka w mantysie wpływa na wartośćcechy liczby.
Przesunięcie przecinka o 1 pozycję w lewo wymaga zwiększenia cechy o 1.
Przesunięcie przecinka o 1 pozycję w prawo wymaga zmniejszenia cechy o 1.
Liczba zmiennoprzecinkowa -przykłady
Przykład dla systemu dziesiętnego:
32.246 = 0.32246 × 102
0.000183 = 0.183 × 10−3
−84239253.5 = −0.842392535 × 108
Wartość dziesiętna liczby zmiennoprzecinkowej - zadanie
Obliczyć wartość zmiennoprzecinkowej liczby trójkowej 2,21 x 1021
(3).
Najpierw obliczmy wartości poszczególnych składników liczby zmiennoprzecinkowej pamiętając, iż każdy z nich jest zapisany w systemie trójkowym:
m = 2,21(3) = 2 x 30 + 2 x 3-1 + 1 x 3-2 = 2 + 2/3 + 1/9 = 2 7/9p = 10(3) = 1 x 31 + 0 x 30 = 3e = 21(3) = 2 x 31 + 1 x 30 = 2 x 3 + 1 = 6 + 1 = 7
Teraz wykorzystujemy podany wzór do wyznaczenia wartości dziesiętnej tej liczby:
L = m x pe = 2 7/9 x 37 = 25/9 x 37 = 6075
Znormalizowana liczba zmiennoprzecinkowa
Ponieważ liczbę zmiennoprzecinkową można zapisywać w różny sposób, przyjęto tzw. postać znormalizowaną.
Znormalizowana liczba zmiennoprzecinkowa to taka, w której mantysa spełnia nierówność:
p > | m | ≥ 1
Według tej definicji postacią znormalizowaną dla zapisów:
325 x 1020 = 32,5 x 1021 = 3,25 x 1022 = 0,0325 x 1024
jest jedynie zapis 3,25 x 1022.
Jak zapisać liczbę w postaci zmiennoprzecinkowej?
zapisujemy mantysę przy wykładniku równym zero
normalizujemy mantysę modyfikując wykładnik liczby
dodatkowo może nastąpić obcięcie albo zaokrąglenie mantysy do zadanej ilości cyfr, np. obcięcie: - zaokrąglenie:
• 1523,169(10)
• 1523,169×100(10)
• 1,523169×103(10)
• Obcięcie: 1,5232×103(10)
• Zaokrąglenie: 1,5231×103(10)
Zmiennoprzecinkowe liczby binarne
Liczby są kodowane w jednym słowie maszyny podzielonym na
trzy części:znak liczby (zwykle 1 bit)jedna część (zwykle znacznie dłuższa) zawiera kod mantysyliczby i jej znak,druga część (kilkubitowa) - kod cechy liczby i jej znak.
L = (-1)s x m × 2c
S – bit znaku ( 0 oznacza znak +, 1 znak - )M – znormalizowana liczba zapisana jako binarna liczba naturalnac – wykładnik potęgi, czyli informacja o ile miejsc przesuwamy
przecinek; może być dodatnia lub ujemna; jest zapisana w kodzie uzupełnień do 2.
W praktycznych realizacjach zapisu liczb zmiennoprzecinkowych przyjmuje się ograniczony zakres na mantysę i cechę
Reprezentacja jest znormalizowana, tzn. bity mantysy sąprzesunięte tak, aby pierwsze miejsce po przecinku zajmowałpierwszy znak 1 ciągu mantysy.
(0.5)10 ≤ |mantysa| < 1
Z powyższego powodu liczba w zapisie zmiennoprzecinkowym jest określona z pewną dokładnością i może występować tylko w określonym zakresie
Zmiennoprzecinkowe liczby binarne
Zakodowana liczba zmiennoprzecinkowa ma postać:
Zmiennoprzecinkowe liczby binarne
Błąd zaokrąglenia
Wystąpi wtedy, gdy część wartości liczby zostaje utracona w wyniku braku wystarczającej długości mantysy.
Format IEEE 754
Aby ujednolicić wyniki obliczeń numerycznych wykonywanych na różnych platformach sprzętowych, wprowadzono ściśle określony standard zapisu zmiennoprzecinkowego IEEE 754.
Pełna nazwa standardu to: IEEE Standard for BinaryFloating-Point Arithmetic (ANSI/IEE Std 754-1985)
Obecnie praktycznie wszystkie implementacje sprzętowe liczb zmiennoprzecinkowych oparte są o ten standard
Format IEEE 754
Standard IEEE 754 definiuje dwie podstawowe klasy liczb zmiennoprzecinkowych:
32 bitowe - pojedynczej precyzji (ang. single-precision) 64 bitowe - podwójnej precyzji (ang. double-precision)
23 bity8 bitów1 bit32 bity - pojedyncza precyzja
52 bity11 bitów1 bit64 bity - pojedyncza precyzja
Bity mantysyBity cechyBit znakuFormat
Format IEEE 754
W standardzie IEEE 754 zdefiniowane zostały także inne klasy liczb zmiennoprzecinkowych:
pojedynczej rozszerzonej precyzji (ang. single-extendedprecision) – liczby ≥ 43-bitowe, nie są powszechnie stosowane
podwójnej rozszerzonej precyzji (ang. double-extendedprecision) – liczby ≥ 79-bitowe, zazwyczaj implementowane jako 80-bitowe
Format IEEE 754
Standard IEEE 754 definiuje także trzy formaty stałoprzecinkowe dwójkowe i jeden stałoprzecinkowy format dziesiętny BCD:
16-bitowy format całkowity (ang. short integer)
32-bitowy format całkowity (ang. integer)
64-bitowy format całkowity (ang. extended integer)
80-bitowy format dziesiętny BCD (kodowanie 18-cyfrowej liczby całkowitej dziesiętnej oraz znaku na najbardziej znaczącej pozycji)
Format IEEE 754
Standard IEEE 754 definiuje nie tylko sposób reprezentacji liczb, ale także:
sposób reprezentacji specjalnych wartości, np. nieskończoności, zera
sposób wykonywania działań na liczbach zmiennoprzecinkowych
sposób zaokrąglania liczb
Norma IEEE 754 jest standardem dwójkowym, w którym wymaga się, aby bazą wszystkich reprezentacji było 2
Format IEEE 854
Istnieje także norma IEEE 854 będąca standardem uniwersalnym, niezależnym od bazy :
obejmuje arytmetykę dwójkową i dziesiętną
nie precyzuje dokładnie przyporządkowania poszczególnych bitów ani sposobu kodowania liczb zmiennoprzecinkowych
PrzykładChcemy zapisać liczbę 1984.0415 w kodzie zmiennoprzecinkowym pojedynczej precyzji:
Przeliczamy liczbę 1984.0415:1984 = 1111100000020,0415 = 0.0000101010121984.0415 = 11111000000.00001010101
Dokonujemy normalizacji – czyli przesuwamy przecinek tak, aby przed przecinkiem znajdowała się tylko jedna niezerowacyfra. Wychodzi coś takiego:
1.111100000000001010101
Przykład
Ostatecznie mantysę utworzą kolejne cyfry spisane od przecinka dotąd, dokąd zmieszczą się w przyjętej długości mantysy (u nas 23 bity).
Gdybyśmy mięli mniej cyfr, niż jest potrzebne, mantysęuzupełnia się zerami z prawej strony.
Czyli uzupełniamy 11111000000 do 23 bitów: 11110000000000000000000
Przykład
Teraz zajmiemy się cechą. Pamiętamy, że przecinek przesunęliśmy o 10 miejsc w lewo. Jako cechę trzeba więc będzie zapisać liczbę 10 w kodzie U2. Ostatecznie cecha wygląda tak: c = (01010)U2
Mamy już wszystkie części liczby.
1984.0415 = 0 01010 1111000000