26
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 informacji Sposób reprezentacji informacji w systemie

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