Les 2: Gegevensvoorstelling Deze les handelt over de voorstelling van gegevens in een computer. Aangezien een computer enkel met enen en nullen werkt, zal men alle gegevens die men wil voorstellen in een computersysteem moeten representeren als een sequentie van enen en nullen. De manier waarop dit gebeurt is het onderwerp van deze les. There are only 10 different kinds of people in the world: those who know binary and those who don't. - Anoniem
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Eenheid van informatie binary digit of bit 0 of 1 “vals” of “waar” “false” of “true” George Boole (1815-1864) In een computer wordt alle informatie voorgesteld als patronen van bits. Een bit of “binary digit” kan enkel de waarde 0 of 1 aannemen. Men spreekt ook wel van vals/false/off (0) en waar/true/on (1). George Boole is de vader van de “boolese logica”, een vorm van algebra voor de representatie van logica, uitgaande van bits.
Logische operaties O1 O2 en 0 0 0 0 1 0 1 0 0 1 1 1 O niet 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1 O niet 0 1 1 0 monadische operatie dyadische operaties O1 O2 of 0 0 0 0 1 1 1 0 1 1 1 1 O1 O2 eof 0 0 0 0 1 1 1 0 1 1 1 0 Operaties in de boolese algebra noemen we “logische operaties”. Hier worden enkele monadische (één operand) en dyadische (twee operandi) operaties getoond door middel van hun waarheidstabel. De waarheidstabel (truth table) toont de waarde van het resultaat (of de output) bij een bepaalde input, en dit voor alle mogelijke inputs. Net omdat het om logische operaties gaat, waarbij de operandi aan de input enkel 0 of 1 als waarde aannemen, is het mogelijk alle inputs op te sommen zonder een al te lange lijst te bekomen. De operaties zijn - NIET: keert de waarde om - EN: geeft 1 als output enkel als beide inputs 1 zijn, anders 0 als output - OF: geeft 0 als output enkel als beide inputs 0 zijn, anders 1 als output - EOF (exclusieve OF): geeft 1 als output als beide inputs verschillend zijn, anders 0. De hier besproken binaire operaties zijn commutatief, d.w.z. dat de volgorde van de operandi in de bewerking geen invloed heeft op het resultaat.
Bitsgewijze logische operaties: en 0000 0100 0100 0101 0000 1110 0100 0101 masker 0000 1110 en 0000 0100 0000 1110 0100 0101 en Bitsgewijze logische operaties voeren logische operaties uit op bitpatronen, waarbij de logische operatie wordt uitgevoerd ‘bit-per-bit’, ttz. de operatie wordt uitgevoerd op de corresponderende bits van de beide bitpatronen. Naast deze puur logische benadering kan je één van de 2 bitpatronen ook zien als een “masker”, dat wordt toegepast op het andere bitpatroon. Voor de EN operatie is het effect van het masker dat het enkel die bits doorlaat van het originele patroon welke overeenstemmen met een 1 in het masker (te vergelijken met een carnavalsmasker dat sommige delen van het gelaat bedekt laat en andere dan weer niet). De andere bits worden op 0 gezet. Hier wordt dit geïllustreerd door de 1-bits in het masker rood te kleuren, en de “doorgelaten” bits van het originele patroon groen te kleuren (zowel in input als output). Door de commutativiteit van de EN-operatie, kan men ook het andere bitpatroon als masker gebruiken, en toch hetzelfde resultaat bereiken. De werking van het masker is wel verschillend (andere bits). Een EN-masker laat toe bepaalde bits op nul te zetten, en ander door te laten.
Bitsgewijze logische operaties: of 0100 1111 0100 0101 0000 1110 0100 0101 masker 0000 1110 of 0100 1111 0000 1110 0100 0101 of Zie ook de opmerkingen bij de vorige dia “Bitsgewijze logische operaties: EN” Ook bij de bitsgewijze OF kan je de werking van een “masker” herkennen. Het masker laat de echte waarde van de input door (groene bits) waar het masker de waarde 0 heeft (rode bits). Waar het masker de waarde 1 heeft, komt ook een 1 in de output (blauwe bits). Ook de bitsgewijze OF is commutatief. Een OF-masker laat toe bepaalde bits op 1 te zetten, en andere door te laten.
Bitsgewijze logische operaties: exclusieve of (eof) 0100 1011 0100 0101 0000 1110 0100 0101 masker 0000 1110 eof 0000 1110 0100 0101 eof 0100 1011 0000 1110 0100 0101 eof Zie ook de opmerkingen bij de vorige dia “Bitsgewijze logische operaties: EN” Ook bij de bitsgewijze EOF kan je de werking van een “masker” herkennen. Het masker laat de echte waarde van de input door (groene bits) waar het masker de waarde 0 heeft (zwarte bits). Waar het masker de waarde 1 heeft (rode bits), worden de originele bits omgekeerd in de output (blauwe bits). Door de operatie te herhalen met hetzelfde masker, bekomen we de originele waarde terug. Een EOF-masker laat toe bepaalde bits om te keren (zoals in een NIET operatie), en andere door te laten. De EOF operatie kan nog anders omgeschreven worden: EOF berekent een modulo-2 optelling van de input bits (0+0=0, 0+1=1, 1+0=1, 1+1=0) EOF telt het aantal 1-bits aan de input, en geeft 1 als dit aantal oneven is, anders 0. Beide beschrijvingen blijven van toepassing wanneer de EOF operatie wordt toegepast op meer dan 2 operandi. eof = modulo-2 optelling eof = oneven aantal 1-bits
Voorbeelden en 0100 0101 0000 1110 0000 0100 en 0100 0101 1111 0001 0100 0001 of 0100 0101 1111 0001 1111 0101 0100 0101 0000 1110 0100 1111 of eof 0100 0101 Hier worden nog enkele voorbeelden gegeven van de bitsgewijze logische operaties. Met de uitleg bij de vorige dia’s, mag je hier geen problemen mee hebben. Merk op dat de verzameling van operaties compleet is. We kunnen immers een willekeurig bit Op 0 zetten Op 1 zetten Omkeren Behouden Dit zijn de enige 4 operaties zijn die we op een bit kunnen uitvoeren. Door de geschikte combinatie van masker en operatie te kiezen kan dit op efficiënte manier gebeuren. ?
Alle boolese functies van 2 veranderlijken 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 “0” en O1 O2 eof of of eof O2 O1 en “1” Eerder zagen we al enkele waarheidstabellen van dyadische operaties. De waarheidstabel van elke binaire logische functie verschilt enkel in de 4 binaire output waarden. Zodoende weet men dat er 24 (=16) binaire logische functies bestaan. Deze zijn hierboven voorgesteld, met vermelding van de functie die ze uitvoeren. Een streep boven de naam van de functie, stelt de negatie van die functie voor. Andere functies die we nog niet tegenkwamen zijn: - O1: herhaalt de input O1 - O2: herhaalt de input O2 - : als O1 dan O2 - : als O2 dan O1 Bemerk dat (O1 O2) overeenkomt met ((NIET O1) OF O2) (ga dit na aan de hand van hun waarheidstabel). A B A of B
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Hexadecimale notatie 4 bits = 1 nibble: in C: z = 0x15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 A B C D E F Een patroon van 4 bits noemen we een nibble. Wanneer we dit patroon gaan interpreteren als binair getal (getal in het 2- delig talstelsel), dan is een nibble de voorstelling van een getal tussen 0 en 15 (10-delig talstelsel), zoals hierboven aangegeven. Om elke waarde voor te stellen met één enkel teken, worden de getallen 10 tot 15 in de hexadecimale voorstelling (16-delig talstelsel) voorgesteld door de letters A tot F. Samengevat: een hexadecimaal cijfer wordt binair voorgesteld door een nibble (4 bits), en hexadecimaal door de hexadecimale tekens 0-F. In de programmeertaal C worden hexadecimale getallen voorgesteld door ze te laten voorafgaan door het prefix 0x. Het getal 0x13 stelt dan de decimale waarde 19 voor. in C: z = 0x15
Octale Notatie 000 001 010 011 100 101 110 111 1 2 3 4 5 6 7 Bitpatronen van 3 bits stellen de decimale getallen 0 tot 7 voor. Soms gebruikt men het octale talstelsel (8-delig), met gebruik van de octale cijfers 0-7. In de programmeertaal C kan men octale getallen ingegeven door ze met een leidende 0 te laten starten. Dit wil zeggen dat 014 eigenlijk het decimale getal 12 voorstelt en niet het decimale getal 14. Die leidende 0 heeft in dit geval dus wel degelijk een semantische betekenis. in C: z = 015
Byte 2 nibbles = 1 byte Voorbeeld van een byte: 0101 1101 Hexadecimaal: 5 D 1 kibibyte (KiB) = 210 = 1024 bytes 1 mebibyte (MiB) = 220 = 1 048 576 bytes 1 gibibyte (GiB) = 230 = 1 073 741 824 bytes Een byte is 2 nibbles of 8 bits. Het is voor te stellen door 2 hexadecimale cijfers. Een byte is de eenheid voor de grootte van zowat alle geheugenopslagruimten in een computer (RAM, harde schijf, CD, DVD, etc). De volgende orden van grootten worden standaard gebruikt (bi = binair) - 1 KiB (kibibyte): 210 bytes = 1024 bytes (kilobinair – let op de hoofdletter) - 1 MiB (mebibyte): 220 bytes (megabinair) - 1 GiB (gibibyte): 230 bytes (gigabinair) - 1 TiB (tebibyte): 240 bytes (terabinair) Vuistregel! Onthoud dat bij benadering 210 ongeveer gelijk is aan 103. De oude benamingen kilobyte, megabyte enz. worden nu enkel nog gebruikt voor machten van 10, dit om verwarring met de binaire equivalenten te vermijden. Merk op dat de woorden bit, byte, en nibble (toevallig) allemaal wel iets met beetjes afknabbelen te maken hebben: a bit: een beetje a nibble: het geknabbel a bite: een beet of hap Dezelfde regels gelden voor bits. In de afkortingen gebruikt men dan wel een b i.p.v. B. 1 tebibyte (TiB) = 240 ~ 1 biljoen bytes 1 Kibibit (Kib) = 210 bit = 1024 bit
Grootte-orden Yotta (Y) 1024 Zetta (Z) 1021 Exa (E) 1018 Peta (P) 1015 Tera (T) 1012 Giga (G) 109 Mega (M) 106 kilo (k) 103 yocto (y) 10-24 zepto (z) 10-21 atto (a) 10-18 femto (f) 10-15 piko (p) 10-12 nano (n) 10-9 micro (,u) 10-6 milli (m) 10-3 Deze dia geeft de metrische grootte-orden weer. Merk op dat, zoals gezien in de vorige dia, deze voorvoegsels in combinatie met binair, de orden kibi, Mebi, etc. niet 103 , 106 … voorstellen, maar wel 210, 220, etc. De eenheden in het rood zijn de meest voorkomenden in de informatica. Merk op dat KiB en Kib met een K geschreven wordt i.p.v. een k.
En verder, voor de nerds 1021 zetta Z 10-21 zepto z 1024 yotta Y 10-24 yocto y 1027 xona X 10-27 xonto x 1030 weka W 10-30 wekto w 1033 vunda V 10-33 vunkto v 1036 uda U 10-36 unto u 1039 treda TD 10-39 trekto td 1042 sorta S 10-42 sotro s 1045 rinta R 10-45 rimto r 1048 quexa Q 10-48 quekto q 1051 pepta PP 10-51 pekro pk 1054 ocha O 10-54 otro o 1057 nena N 10-57 nekto nk 1060 minga MI 10-60 mikto mi 1063 luma L 10-63 lunto l
Een woord Woord: aantal bytes (2,4,8) (architectuur-afhankelijk) Dubbelwoord: 2 woorden Quadwoord: 4 woorden Een woord is een bepaald aantal bytes. Het aantal is afhankelijk van de context. Vaak wordt de woordgrootte (of breedte) van een processor gedefinieerd als het aantal bytes die in één keer kunnen bewerkt worden (b.v. opgeteld). Indien men spreekt over de woordbreedte van het geheugen dat heeft men het doorgaans over het aantal bytes dit in een keer met het geheugen kunnen uitgewisseld worden. Huidige architecturen hebben doorgaans woorden van 4 tot 8 bytes. Oude architecturen, en sommige eenvoudige architecturen, werken met 4, 8 of 16 bit woorden. In de praktijk wordt om historische redenen woord vaak gebruikt voor een 16- bit grootheid.
Voorbeeld 01010101010100001110101010110111 ... 0101 0101 0101 0000 1110 1010 1011 0111 ... 5 5 5 0 E A B 7 ... 55 50 EA B7 ... 5550 EAB7 ... Een bitpatroon kan je op verschillende manieren bekijken of interpreteren… - als een lange bitstring - als opeenvolging van nibbles (4 bits) - als opeenvolging van hexadecimale cijfers - als opeenvolging van bytes (2 hex cijfers). - als opeenvolging van 2-byte woorden - als opeenvolging van 4-byte woorden etc. De wijze waarop je een bitpatroon interpreteert hangt af van wat het bitpatroon voorstelt, en welke architectuur je gebruikt. 5550EAB7 ...
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Binair Gray code UPC code QR-code Binair gecodeerde decimalen (BCD) Excess-3 code Voorstelling van gehele getallen Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Natuurlijke getallen: binair 1 2 3 4 5 6 … 1 10 11 100 101 110 … 0000 0001 0010 0011 0100 0101 0110 4 bit 00000000 00000001 00000010 00000011 00000100 00000101 00000110 8 bit Natuurlijke getallen (= positieve gehele getallen) binair voorstellen, gebeurt op dezelfde manier als in het tiendelig talstelsel, maar dan met slechts twee symbolen. In het kader van een vast bitpatroonlengte, zal men een gepast aantal nullen (groen) toevoegen vooraan het binaire getal, om het bitpatroon een vaste lengte te geven. Deze leidende nullen hebben geen invloed op de waarde van het voorgesteld getal.
Waarde van binaire voorstelling Bereik: [0 2n-1] Aantal verschillende waarden: 2n De waarde A van een binaire voorstelling wordt berekend aan de hand van de formule die de waarde van een getal in een positioneel talstelsel met basis 2 uitdrukt. In n bits kunnen we precies 2n verschillende waarden voorstellen. Alle bitpatronen worden m.a.w. gebruikt om een verschillende waarde voor te stellen.
Waarde van binair getal 15610 = 100111002 22 27 24 23 15610 = 1x27 + 1x24 + 1x23 + 1x22 = 128 + 16 + 8 + 4 = 156 Een binair getal is de voorstelling van dat getal in het tweedelig talstelsel. Zoals 15610 = 1x100 + 5x10 + 6x1 in het tiendelig talstelsel, zo is 100111002 = 1x27 + 1x24 + 1x23 + 1x22 in het tweedelig talstelsel Het tweedelig talstelsel, is - net zoals het tiendelig talstelsel - een positioneel talstelsel, hetgeen betekent dat de uiteindelijke waarde van een cijfer in het getal afhangt van zijn plaats in het getal. Hoe meer een cijfer zich naar links bevindt, des te groter zijn gewicht.
Decimaal binair 10011100 156/2 = 78 rest 0 78/2 = 39 rest 0 De omzetting van decimaal getal naar binair getal gebeurt volgens de geïllustreerde berekeningswijze: Het begingetal (156) wordt gedeeld door 2 (gehele deling). Het resultaat is 78, de rest is 0. Deze rest (hier 0) is het minst beduidende cijfer van het binaire getal. Dan gaat men door met het resultaat van de vorige deling. Men deelt opnieuw door 2, onthoudt het resultaat voor het vervolg van de bewerking, en behoudt de rest als volgende cijfer van het binaire getal. Dit herhaalt men tot het resultaat van de deling 0 is. Aldus wordt het binaire getal geconstrueerd van minst beduidend cijfer tot meest beduidend cijfer. Mits enige oefening kan men dit algoritme uit het hoofd uitvoeren.
Binair decimaal 10011100 0 x 2 + 1 = 1 1 x 2 + 0 = 2 2 x 2 + 0 = 4 De omzetting van binair getal naar decimaal getal, is een eenvoudige berekening. Zoals eerder getoond, stelt elke bit een bepaalde waarde voor, zoals dit geldt voor elke getalvoorstelling in de n-delig talstelsels. Aldus kan men berekenen dat 100111002 = 1x27 + 1x24 + 1x23 + 1x22 = 128 + 16 + 8 + 4 = 156. Een andere berekeningswijze die hetzelfde resultaat oplevert begint bij de meest beduidende bit. Voor elke bit wordt het vorige tussenresultaat vermenigvuldigd met 2, en wordt er dan de waarde van de bit bijgeteld. Ook deze berekening kan - mits enige oefening - uit het hoofd uitgevoerd worden. Toon aan dat deze manier van werken kan afgeleid worden aan de hand van de formule die de waarde van een binaire voorstelling weergeeft (som van gewogen machten van 2).
De binaire representatie is niet de enig mogelijke afbeelding 11 3 10 2 00 1 Deze figuur geeft weer op welke manier de getallen 0,1,2,3 afgebeeld worden op een patroon van 2 bits in de binaire voorstelling. Dit is slechts 1 manier om getallen af te beelden op bitpatronen. In theorie zijn er hier 4! of 24 verschillende afbeeldingen mogelijk. In principe kunnen die allemaal gebruikt worden om deze 4 getallen af te beelden op een bitpatroon, maar uiteraard zullen de verschillende afbeeldingen verschillende eigenschappen bezitten die voor bepaalde toepassingen meer of minder nuttige eigenschappen hebben. In wat volgt zullen een aantal alternatieve afbeeldingen voor gehele getallen besproken worden. 01
Gray code G3 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 2 3 4 5 6 7 G2 1 1 1 2 3 1 G1 1 11 10 01 00 3 2 1 Door hun structuur komt het bij het sequentieel aflopen van de getallen in een binaire of in een complement-notatie geregeld voor dat een groot aantal bits simultaan van waarde veranderen. In sommige gevallen is dit ongewenst omdat men niet steeds kan garanderen dat alle cijfers simultaan veranderen (zeker indien de verandering mechanisch gebeurt, zoals b.v. het optisch uitlezen van de stand van een roterende schijf met geponste gaten). Gray codes hebben als eigenschap dat er per overgang precies 1 bit verandert. Op deze dia staat de structuur van de reflectieve Gray codes beschreven. Merk op dat er na de grootste waarde door 1 bitovergang terug naar de kleinste waarde overgegaan wordt. Wiskundig kan men de gray code voor het getal x berekenen door x eerst om te zetten naar zijn binaire voorstelling: xb en dan de volgende bewerking uit te voeren: xb xor (xb>>1). Reflectieve Gray code
UPC-code cijfer linkercode rechtercode 0 0001101 1110010 0 0001101 1110010 1 0011001 1100110 2 0010011 1101100 3 0111101 1000010 4 0100011 1011100 5 0110001 1001110 6 0101111 1010000 7 0111011 1000100 8 0110111 1001000 9 0001011 1110100 Universal Product Codes (UPC) worden gebruikt in barcodes (voornamelijk in de VS, daarbuiten wordt een internationale variant, de EAN-13-code gebruikt). De code begint met een start code (101), gevolgd door 6 cijfers uit de linkercode, een middencode (01010 ), 6 cijfers uit de rechtercode en een eindcode (101). Er worden 7 bits per cijfer gebruikt, en voor elk cijfer bestaan er twee varianten die elkaars inverse zijn. Zelfs dan worden er maar 20 van de 128 verschillende bitpatronen effectief gebruikt. Indien alle bitpatronen gebruikt zouden worden zou het niet mogelijk zijn om foute patronen te detecteren of te corrigeren. Indien men de detectie van fouten belangrijk vindt, moet men redundantie in de codering inbouwen. Bij de UPC-code worden er per cijfer twee varianten gebruikt. Dit is een bijkomende beveiliging om de oriëntatie van de barcode te kunnen vaststellen. In de linker helft wordt de linkercode gebruikt, in de rechterhelft de rechtercode. In het begin, in het midden en op het einde van de code staan er zogenaamde guard bars die moeten helpen om de barcode te lokaliseren en de rest van het patroon te interpreteren. http://www.youtube.com/watch?v=e6aR1k-ympo
QR-code Versie 40: (177x177) (Max capaciteit: 2953 B) Versie 1 (21x21) 4 niveaus van foutcorrectie De QR-code (Quick Response Code) is een tweedimensionale barcode die uiteraard meer informatie kan opslaan. Er bestaan 40 versies gaande van een matrix van 21x21 tot een matrix van 177x177. Er zijn vier niveaus van foutcorrectie. Hoe hoger het niveau van foutcorrectie, hoe minder data er kan opgeslagen worden. Het verschil in opslagcapaciteit tussen het hoogste en het laagste niveau is ongeveer 50%. Linksonder ziet u ‘beschadigde’ qr-codes die dankzij de foutcorrigerende eigenschappen toch nog correct gelezen kunnen worden. Versie 40: (177x177) (Max capaciteit: 2953 B)
Natuurlijke getallen: BCD Binary Coded Decimal 156 10011100 0001 0101 0110 1 5 6 Binary coded decimal (binair gecodeerde decimalen) is een andere getalvoorstelling, waarbij elk decimaal cijfer van het getal wordt omgezet naar een nibble (4 bit). Deze nibbles worden dan aan elkaar geschakeld in dezelfde volgorde als de cijfers in het decimale getal. Zie de illustratie, waarbij 156 enerzijds is omgezet in een binair getal (links), en anderzijds in een BCD getal. Bemerk dat men met een nibble 16 verschillende waarden kan voorstellen, maar dat elk nibble in een BCD getal maar 10 verschillende waarden zal aannemen. Zes bitpatronen blijven dus onbenut. Dit zorgt ervoor dat de voorstelling in BCD gemiddeld groter zal zijn dan de zuiver binaire voorstelling. Anders gezegd zal men in een bitpatroon met een gegeven lengte (b.v. 16 of 32 bit) meer verschillende getallen kunnen opslaan in een binaire representatie, dan in een BCD- representatie. De binaire representatie is compacter dan de BCD-representatie. 9C 01 56
Packed vs. unpacked 156 1 5 6 0 1 0 5 0 6 01 56 01 05 06 packed BCD 0001 0101 0110 0000 0001 0000 0101 0000 0110 1 5 6 0 1 0 5 0 6 01 56 01 05 06 Bij BCD kan men nog een onderscheid maken tussen packed BCD (4 bit per decimaal cijfer) of unpacked BCD (8 bits per cijfer). De unpacked BCD representatie is nog minder compact dan de packed BCD-representatie. BCD-voorstellingen worden niet zo vaak gebruikt. De voornaamste toepassingen bevinden zich in de financiële sector waar men graag met getallen met een vaste (decimale) lengte werkt (b.v. 9 cijfers). Een dergelijke conventie komt men ook tegen in databanktoepassingen. packed BCD unpacked BCD
Excess-3 code BCD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 E3 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1 2 3 4 5 6 7 8 9 0011 3 1000 8 1011 11 1 0001 0110 3 1011 8 1 0001 11 De excess-3 code is een alternatief voor de BCD-code. Deze code heeft twee belangrijke voordelen. De optelling genereert automatisch een overdracht naar de hogere rang. Het berekenen van het complement van x (9-x) kan gebeuren door de individuele bits te complementeren. Het nadeel van de code is dat haar interpretatie minder intuïtief is en dat ze niet gewogen is. Dit laatste wil zeggen dat er geen gewichten per rang kunnen gevonden worden om de uiteindelijke waarde te bepalen. Bewerkingen met deze code zijn verre van eenvoudig. De regel is dat indien er geen overdracht is het resultaat met 3 moet verminderd worden, en indien er wel een overdracht is het resultaat met 3 moet verhoogd worden. 1 0100
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Teken + grootte 1-complement 2-complement Verschoven Binair gecodeerde decimalen (BCD) Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Gehele getallen: teken + grootte -3 -2 -1 -0 1011 1010 1001 1000 10000011 10000010 10000001 10000000 00000000 00000001 00000010 00000011 8 bit 1 2 3 … 000 001 010 011 3 bit Tot dusver hebben we positieve gehele getallen omgezet in binaire getallen. Om alle gehele getallen te kunnen voorstellen, moeten we ook een oplossing hebben om negatieve getallen voor te stellen. Een mogelijkheid hiertoe wordt voorgesteld in deze dia (teken + grootte of signed magnitude): de absolute waarde van het getal wordt binair voorgesteld en voorafgegaan door een tekenbit (1 voor negatieve getallen, 0 voor positieve getallen). Dit is gelijkaardig aan de wijze waarop we werken in het decimaal talstelsel: de absolute grootte van een getal wordt al dan niet voorafgegaan door een minteken. Het enige verschil is dat het minteken hier door een 1 wordt voorgesteld. Bemerk dat er aldus 2 voorstellingen zijn voor het cijfer 0! Dit fenomeen doet zich ook voor in het decimaal talstelsel, maar wij hebben geleerd daar mee om te gaan (weinigen zullen -0 schrijven als ze 0 bedoelen). Twee voorstellingen voor dezelfde waarde zijn echter niet wenselijk in een computer (het maakt het vergelijken van getallen moeilijker). Een ander probleem is dat de rekenregels voor negatieve getallen verschillend zijn van die voor positieve getallen (b.v. indien men 1 wenst op te tellen). Ook de regel om de precisie van de getallen te veranderen (b.v. van 4 naar 8 bit) is niet echt eenvoudig: men moet eerst de tekenbit weghalen, dan de precisie aanpassen, en naderhand de tekenbit terugplaatsen. 4 bit -7 7 -127 127
Gehele getallen: teken+grootte Bereik: [-(2n-1-1) 2n-1-1] Aantal verschillende waarden: 2n-1 Het bereik van deze notatie is symmetrisch maar gebruikt niet alle bitpatronen om verschillende waarden voor te stellen. Door de dubbele voorstelling voor de nul kunnen er dus maar 2n-1 verschillende waarden voorgesteld worden. De teken+grootte voorstelling wordt gebruikt bij vlottende- kommagetalvoorstellingen (zie verder).
Gehele getallen: 1-complement “inverteren van bits” 0110 6 1001 -6 Alle positieve getallen worden afgebeeld op negatieve en vice versa Een andere manier om gehele getallen voor te stellen, is door de negatieve getallen af te leiden van de positieve getallen door een bitsgewijze inversie van het positieve getal (1-complement). Opnieuw herken je negatieve getallen gemakkelijk doordat de meest beduidende bit 1 is. Bemerk dat er aldus opnieuw 2 voorstellingen zijn voor het cijfer 0! In totaal kunnen de getallen van -7 tot 7 voorgesteld worden (4 bit) of -127 tot 127 (8 bit) 1-complement wordt weinig gebruikt in de praktijk.
Gehele getallen: 1-complement -3 -2 -1 -0 1100 1101 1110 1111 11111100 11111101 11111110 11111111 00000000 00000001 00000010 00000011 8 bit +1 +1 +1 +1 tekenuitbreiding 1 2 3 … 0000 0001 0010 0011 4 bit +1 +1 +1 Vergeleken met de teken+grootte voorstelling, kan men al iets makkelijker berekeningen maken met de 1-complement voorstelling, zoals in de dia wordt getoond. De voorstelling van getal N+1 kan je berekenen bij het bitpatroon van N de waarde 1 op te tellen (zowel voor positieve als voor negatieve getallen). Dit lukt echter niet in de buurt van 0 omdat omdat (-0) + 1 = (+0). De overgang van 4 bit naar b.v. 8 bit is gemakkelijk te realiseren door de meest linkse bit (de tekenbit) van het 4-bit getal te herhalen vooraan het 8-bit getal. Men kan ook van een grotere naar een kleinere voorstelling gaan door de meest linkse bit weg te laten, op voorwaarde dat de nieuwe tekenbit dezelfde blijft. Als deze verandert klapt immers het teken van het getal om, waardoor we met zekerheid een andere waarde krijgen (tenzij bij 0). -7 7 -127 127
Voorbeeld 1-complementoptelling 3 0011 1 0001 3 0011 -1 1110 + 11010 1 -3 1100 -1 1110 + 1011 -4 + 4 0100 10001 + 1 0010 2 Het rekenen met 1-complementgetallen vereist een wat speciale aanpak. De regel is dat de overdracht die gegenereerd wordt ook nog eens moet opgeteld worden bij de som om de correcte 1-complementvoorstelling te genereren. De rekenregel is dezelfde voor de positieve als voor de negatieve getallen. Som = A+B+overdracht
Gehele getallen: 2-complement -3 -2 -1 1 2 3 … 1101 1110 1111 11111101 11111110 11111111 00000000 00000001 00000010 00000011 8 bit +1 +1 0000 0001 0010 0011 4 bit tekenuitbreiding De 2-complement voorstellingswijze is de meest gebruikte voor gehele getallen, omwille van de eenvoud waarmee men ermee kan rekenen. Er is nu slechts 1 voorstelling voor het getal 0. De voor te stellen getallen gaan van -8 tot 7 (voor 4-bit getallen). Dezelfde methode van tekenuitbreiding als voor 1-complement getallen is van toepassing: herhaling van de tekenbit vooraan het getal om over te gaan van b.v. 4-bit naar 8-bit getalvoorstelling. -8 7 -128 127
1-complement 2-complement Bereik: [-(2n-1-1) 2n-1-1] Aantal verschillende waarden: 2n-1 2-complement Het bereik van de 1-complementnotatie is symmetrisch. Door de dubbele voorstelling voor de nul kunnen er dus maar 2n-1 verschillende waarden voorgesteld worden. Het bereik van de 2-complementnotatie is asymmetrisch en gebruikt nu wel alle bitpatronen om verschillende waarden voor te stellen. Daardoor kunnen er nu 2n verschillende waarden voorgesteld worden. Bereik: [-2n-1 2n-1-1] Aantal verschillende waarden: 2n
Voorbeeld 2-complementoptelling 3 0011 -1 1111 + 3 0000 0011 -1 1111 1111 2 10000 0010 + 2 10010 modulo 4 bit modulo 8 bit Dit voorbeeld toont aan dat we eenvoudig kunnen rekenen met 2-complement getallen. We maken een gewone binaire optelling, zonder onderscheid te moeten maken voor negatieve of positieve getallen. Het resultaat is correct, en correct voorgesteld in 2-complement getalvoorstelling.
Berekening van 2-complement -4 -3 -2 -1 1 2 3 000 001 010 011 100 101 110 111 1-complement + 1 110 010 000 100 001 101 111 011 1 1 1 1 010 110 1000 100 De 2-complement getalvoorstelling wordt berekend als de 1-complement +1. Voor elk positief/negatief getal bekomt men de negatieve/positieve waarde door de bits te inverteren, en er dan 1 bij op te tellen. Dit wordt in de dia geïllustreerd voor 3-bit getallen. De meest beduidende bit (MSB = most significant bit) is de tekenbit, en duidt op negatieve getallen (als de tekenbit = 1). Als we 0 aanzien als een positief getal, dan zijn er evenveel positieve als negatieve getallen. De voorbeelden tonen aan hoe je berekent dat 110 = -210 omdat de bit-inverse van 110 gelijk is aan 001, en dit vermeerderd met 1 is 010 = 210. Het voorbeeld met de berekening van 000 toont aan dat de voorstelling voor +0 en -0 gelijk zijn (000). De inverse-plus-1 van 000 levert immers 1000 op, waarvan we in 3-bit notatie enkel de minst beduidende 000 behouden. Voor -4d loopt de berekening mank, omdat +4 niet voor te stellen is in dit 3-bit 2-complement systeem. De inverse-plus-1 van -4d of dus 100 is opnieuw 100. Als we 100 interpreteren als gewoon binair getal, is het inderdaad +4. Maar in het 3-bit 2-complement systeem is het -4. Later zullen we zien dat deze (foutieve) berekening kan gedetecteerd worden als overflow. De 2-complementwaarde kan ook berekend worden door de binaire interpretatie van het bitpatroon af te trekken van 2n. Concreet geeft dit b.v. 23- 6=2 OVERFLOW Ook: (2n – waarde) [binair geïnterpreteerd]
Gehele getallen: verschoven -2 -1 1 2 3 4 5 100 101 110 111 000 001 010 011 1 2 3 4 5 6 7 100 101 110 111 000 001 010 011 +1 +1 bias = 2 +1 +1 +1 +1 Een andere voorstellingswijze voor gehele getallen, is “verschoven notatie” of “excess representation”. De getallen worden geïnterpreteerd als unsigned of positief, maar worden verschoven door een “bias” af te trekken van hun waarde. Zo wordt het kleinste numerieke bitpatroon (nullen) toegekend aan de kleinste voorgestelde waarde (- bias). In de dia wordt deze voorstellingswijze geïllustreerd met bias = 2. Deze voorstellingswijze vereenvoudigt het vergelijken van getallen, aangezien het bitpatroon van een kleiner getal steeds kleiner is dan het bitpatroon van een groter getal, wanneer de bitpatronen als voorstelling van een natuurlijk getal wordt geïnterpreteerd. Dit is van nut bij de exponent van vlottende-kommagetallen. Deze exponenten worden immers vergeleken bij optellingen of aftrekkingen, met de bedoeling ze gelijk te maken (zie verder). De andere rekenkundige bewerkingen worden echter ingewikkelder. +1
Gehele getallen: verschoven B = bias Bereik: [-B 2n-1-B] Aantal verschillende waarden: 2n De verschoven notatie verschuift het bereik van de binaire voorstelling met B naar beneden. Het kleinst voorstelbare getal is m.a.w. –B. De verschoven notatie heeft veel goede eigenschappen, maar is minder geschikt dan de 2- complementnotatie omdat de positieve getallen geen door mensen gemakkelijk interpreteerbare representatie hebben. Een belangrijke troef van deze notatie is wel dat men de verdeling tussen positieve en negatieve getallen nu vrij kan kiezen aan de hand van de keuze van de bias.
Basiscomplement codes Het principe van 1-complement en 2-complement kan uitgebreid worden naar een willekeurige basis 2-complement wordt dan de basiscomplementnotatie genoemd voor het talstelsel met basis 2 1-complementnotatie wordt dan de verminderde basiscomplementnotatie genoemd voor het talstelsel met basis 2 Het principe van 1-complement en 2-complement kan verder uitgebreid worden. Voor een cijfer x wordt in het B-delig talstelsel het complement berekend als (B-1)-x. Voor de verminderde basiscomplementnotatie volstaat het om de cijfers te complementeren. Voor de gewone basiscomplementnotatie moet men daar nog 1 bij optellen.
Binair gecodeerde decimalen 3 1 Teken + grootte -301 6 9 8 9-complement -301 (301+698=999) 6 9 10-complement -301 (9-compl + 1) Ook gehele getallen kunnen met behulp van de eerder besproken BCD voorgesteld worden. Een eerste methode is de eerste positie te behouden als teken van het getal (0 voor plus, 1 voor min). Dit is de formalisering van de menselijke handelswijze, maar ze wordt weinig/niet in computers gebruikt. Een tweede methode is de “9-complement”. Dit is de verminderde basiscomplementnotatie voor het tiendelig talstelsel. Voor positieve getallen is de meest linkse positie minder dan 5, voor negatieve getallen is dat 5 of meer. Zo wordt (in een BCD voorstelling met 4 BCD cijfers) +301 voorgesteld door 0301 en -301 door 9698. Dit laatste wordt bekomen door het verschil te maken van 9999 en 0301. Een laatste methode is de “10-complement”. Dit is de basiscomplementnotatie voor het tiendelig talstelsel. Negatieve getallen worden dan berekend als het 9-complement negatieve getal plus 1. In het zelfde voorbeeld wordt het getal -301 voorgesteld als 9699. Voorts zijn de positieve getallen deze van 0 tot 4999 en de negatieve getallen zijn voorgesteld door 5000 tot 9999 (= -5000 tot -1). packed & unpacked
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Voorstelling van reële getallen Vaste-kommavoorstelling Vlottende-kommavoorstelling Voorstelling van lettertekens Voorbeelden
Vaste-kommavoorstelling 0001101001,01010 + 0001001001,01010 0010110010,10100 Geef de komma een vaste plaats in het bitpatroon, en hou rekening met de plaats ervan. Is enkel mogelijk indien het bereik van de te representeren getallen niet te groot is. Deze manier van werken is doorgaans handiger bij het gebruik van BCD- getallen. B.v. rekenen met centen i.p.v. met euro’s. Bij binaire getallen werkt men dan met b.v. 1/16 of 1/128.
Vlottende-kommavoorstelling Vlottende komma: exponent Vlottende komma: mantisse s exp mantisse s expon mantisse s exponent mantisse Reële getallen worden in computers meestal voorgesteld als vlottende- kommagetallen. Deze laten toe een heel groot bereik van getallen voor te stellen in een relatief klein aantal bits. De bits worden opgesplitst in: - een teken bit (sign-bit S) - een exponent E, het aantal bits bepaalt het “bereik” - een mantisse M, het aantal bits bepaalt de “precisie” De waarde van een vlottend-kommagetal volgt uit deze voorstelling via de formule: (-1)S * M * 2E Er bestaan een aantal formaten en standaarden voor vlottende- kommagetallen, waarvan de voornaamste gegeven wordt door ANSI/IEEE 754. Deze beschrijft 2 formaten: single precision en double precision. Het single precision formaat gebruikt 32 bits, waarvan 8 voor de exponent en 23 voor de mantisse. In dubbele precisie zijn er 11 bits voor de exponent en 52 voor de mantisse, en dus 64 bits in totaal. De bits voor mantisse en exponent zijn trouwens nog een beetje “gecodeerd”, zoals wordt uitgelegd in wat volgt. ANSI/IEEE 754 1|8|23 1|11|52 (1980) (-1) × M × 2 S E
Vlottende-kommagetallen 1 10000001 01000000000000000000000 Verschoven representatie Bias = 127 Exponent: 129 - 127 = 2 De exponent wordt voorgesteld als een verschoven versie van het gehele getal. Deze voorstellingswijze werd reeds eerder besproken. In IEEE 754 is de bias 127 (single precision) en 1023 (double precision). Voorts zijn in de standaard de exponenten met enkel 0-bits, en met enkel 1- bits (kleinste en grootste waarde) gereserveerd voor speciale getallen. De werkelijke, gehele waarde van de exponent wordt dus bekomen door de waarde van het exponent-bitpatroon, geïnterpreteerd als natuurlijk getal, te verminderen met de bias.
Vlottende-kommagetallen 1 10000001 01000000000000000000000 Genormaliseerde fractie 1.01000000000000000000000 = 1 + 0 x 2-1 + 1 x 2-2 + 0 x 2-3 + … = 1 + 0 + 0.25 + 0 + … = 1.25 In de mantisse slaat men de genormaliseerde binaire fractie op. Dat wil zeggen dat het een getal betreft met een 1 voor de komma. Omdat dit altijd zo is, wordt die 1 voor de komma ook niet opgeslagen (de zogenaamde “hidden bit”). De mantisse bevat letterlijk enkel het deel na de komma. (Noot: voor het getal 0.0 bestaat een speciale regeling) De dia toont hoe de mantisse geïnterpreteerd moet worden, en hoe de decimale waarde van de genormaliseerde fractie berekend wordt.Voor het gegeven voorbeeld worden ook alle componenten samen genomen (teken, exponent, mantisse) en de reële waarde berekend: (-1)1 x 1.25 x 22 = -1.25 x 4 = -5.0. De interpretatie van een getal in dit formaat is heel wat complexer dan voor binaire of 2-complement notatie. Waarde: (-1)1 x 1.25 x 22 = -1.25 x 4 = -5.0
Bereik & precisie Formaat: 1|2|2, bias = 1 s | e e | m m 00 -1 0.5 00 -1 0.5 01 0 1 10 1 2 11 2 4 00 1.00 01 1.25 10 1.50 11 1.75 Vlottende-kommagetallen maken, binnen de beschikbare bitlengte, een compromis tussen bereik en precisie van de voor te stellen getallen. Het bereik (het grootste en kleinste getal in absolute waarde) wordt vnl. bepaald door het aantal bits in de exponent, en het getal waarvan de macht wordt genomen (hier 2); de precisie wordt vnl. bepaald door het aantal bits in de mantisse. In het voorbeeld dat wordt gegeven (2 bits voor exponent (bias 1) en 2 bits voor mantisse), kunnen we eenvoudig berekenen welke waarden mogelijk zijn voor de delen M en 2E in de formule (-1)S * M * 2E. De mantisse gaat van 1.00 tot 1.75, en het exponent-deel neemt waarden aan van 0.5 tot 4 (E = -1 tot 2). De uiteindelijke waarde zal voorgesteld worden door het product van de twee. Noot: eerder werd al verteld dat getal 0.0 een uitzonderlijk geval is. In deze voorstelling werd hier opzettelijk nog geen rekening mee gehouden. De uitzondering wordt verderop besproken.
Alle 5-bit vk-getallen Formaat: 1|2|2, bias = 1 1.00 1.25 1.50 1.75 e -1 0.5 0.625 0.75 0.875 1 1.25 1.5 1.75 2 2.5 3 3.5 4 5 6 7 1 Voortgaand op hetzelfde voorbeeld, kunnen we alle mogelijke getallen berekenen die met dit formaat van vlottende-kommagetallen kan worden voorgesteld. De rode pijl geeft aan hoe de getallen van klein naar groot worden gesorteerd (in absolute waarde). 2 Vlottende-kommavoorstelling kan gesorteerd worden
Gesorteerd 0 00 00 0.5 0 00 01 0.625 0 00 10 0.75 0 00 11 0.875 0 01 00 1 0 01 01 1.25 0 01 10 1.5 0 01 11 1.75 0 10 00 2 0 10 01 2.5 0 10 10 3 0 10 11 3.5 0 11 00 4 0 11 01 5 0 11 10 6 0 11 11 7 1 00 00 -0.5 1 00 01 -0.625 1 00 10 -0.75 1 00 11 -0.875 1 01 00 -1 1 01 01 -1.25 1 01 10 -1.5 1 01 11 -1.75 1 10 00 -2 1 10 01 -2.5 1 10 10 -3 1 10 11 -3.5 1 11 00 -4 1 11 01 -5 1 11 10 -6 1 11 11 -7 De getallen worden hier expliciet gesorteerd, en weergegeven in (binaire) vlottende-kommavoorstelling en in decimale voorstelling. Links staan de positieve getallen, rechts de negatieve getallen. Bemerk dat ook de getallen in binaire voorstelling oplopend gesorteerd zijn voor oplopende absolute waarden. Dit volgt uit de specifieke constructie van de vlottende komma getallen (eerst de verschoven voorstelling van de exponent en daarna de genormaliseerde fractie). Gevolg: om vlottende-kommagetallen te sorteren volstaat het om hun bitpatronen te sorteren, zonder de waarde van de getallen te moeten bepalen (de enige uitzondering hierop vormen de negatieve waarden die groter dan de positieve waarde beschouwd zullen worden).
Bereik Formaat: 1|2|2 50% 0.500 0.625 0.750 0.875 1.00 1.25 1.50 2.00 2.50 3.00 3.50 4.00 5.00 6.00 7.00 Formaat: 1|2|2 1.75 0.500 0.625 0.750 0.875 1.000 -0.500 -0.625 -0.750 -0.875 -1.000 0.0000 We zien dat het grootste voor te stellen getal 7 is. Anderzijds is het kleinste voor te stellen positieve getal 0.5. Van het gebied [-1,1] is maar liefst 50% niet voor te stellen. Vooral het feit dat 0 niet kan voorgesteld worden is een grote tekortkoming. 50%
Bereik Formaat: 1|2|2, bias = 1 Gedenormaliseerde getallen (e=0) m 00 01 10 11 e -1 0 0.25 0.50 0.75 Gedenormaliseerde getallen (e=0) 1 1.25 1.5 1.75 1 2 2.5 3 3.5 2 Nan In de IEEE 754 standaard zijn de exponenten met enkel 0-bits, en met enkel 1-bits, gereserveerd voor speciale getallen, zoals reeds gemeld. Als we deze regel ook in dit voorbeeld introduceren, en we ook “gedenormaliseerde” getallen bekijken, krijgen we de volgende gevallen: - clean zero: enkel 0-bits in de exponent en in de mantisse; tekenbit is 0 of 1. Er zijn dus 2 voorstellingen van 0. - gedenormaliseerde getallen (dirty zero): enkel 0-bits in de exponent, mantisse is verschillend van 0. Gedenormaliseerde getallen hebben dezelfde waarde voor de exponent als getallen met exponent-bitpatroon 000…01 (nulpatroon + 1), maar hebben geen hidden 1-bit in de fractie. In het voorbeeld is bv. “00001” gelijk aan: teken 0, exponent 00 (zelfde waarde als voor exponent 01, dus 20), mantisse 01 (dus =0.012 =2-2). Totaal: (-1)0 x 20 x 2-2 = 0.25. - infinity: enkel 1-bits in de exponent, enkel 0-bits in de mantisse; tekenbit is 0 of 1. Infinity wordt gebruikt om getallen voor te stellen die groter zijn dan het grootste getal dat kan voorgesteld worden in het gegeven formaat. Dit kan voorkomen indien men twee getallen optelt waarvan de som niet meer kan voorgesteld worden. - NaN (not a number): enkel 1-bits in de exponent, mantisse is verschillend van 0. NaN kan gebruikt worden als resultaat bij deling 0/0 of / , of ook bij het nemen van de vierkantswortel uit negatieve getallen.
Gesorteerd 0 00 00 0 0 00 01 0.25 0 00 10 0.5 0 00 11 0.75 0 01 00 1 0 01 01 1.25 0 01 10 1.5 0 01 11 1.75 0 10 00 2 0 10 01 2.5 0 10 10 3 0 10 11 3.5 0 11 00 + 0 11 01 Nan 0 11 10 Nan 0 11 11 Nan 1 00 00 -0 1 00 01 -0.25 1 00 10 -0.5 1 00 11 -0.75 1 01 00 -1 1 01 01 -1.25 1 01 10 -1.5 1 01 11 -1.75 1 10 00 -2 1 10 01 -2.5 1 10 10 -3 1 10 11 -3.5 1 11 00 - 1 11 01 -Nan 1 11 10 -Nan 1 11 11 -Nan Wanneer we het voorgaande op de gekende wijze in tabelvorm gieten, krijgen we bovenstaande tabellen. Het blijft zo dat de getallen zowel in binaire vorm als in werkelijk waarde oplopend gesorteerd zijn (naar absolute waarde). Nu wordt ook duidelijk waarom de IEEE standaard 127 of 1023 als bias kiest. Uit een even aantal exponenten (b.v. 256, of 2048) kan men geen middelste waarde kiezen. Van zodra men de grootste exponentwaarde opgeeft om Nan, + en - te kunnen voorstellen, krijgt men een oneven aantal exponenten (255, of 2047), waarvan 127 of 1023 precies in het midden ligt.
Bereik en precisie Formaat: 1|2|2 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 - + 2.00 2.50 3.00 3.50 0.500 0.750 1.000 -0.500 -0.750 -1.000 -0.000 0.250 -0.250 0.000 Nan Nan Nan Met de voorgaande aanpassingen werd het bereik iets verder uitgebreid, en is het kleinste positieve getal nu iets kleiner en dichter bij nul gekomen. Toch blijft het zo dat we slechts een klein aantal van alle reële getallen kunnen voorstellen. Wanneer we b.v. een getal willen voorstellen dat ligt tussen 0.25 en 0.5, zal dat niet lukken. We zullen het dus moeten benaderen door ofwel 0.25 of 0.5. De afstand tussen 2 opeenvolgende voor te stellen getallen, geeft de precisie aan van het vlottende-kommaformaat. Bemerk dat deze afstand niet constant is, maar groeit met de grootte van de getallen waartussen de afstand gemeten wordt.
Voorbeeld Representeer 5.1 in 1|4|8 met bias 7 5.1 = 5 + 0.1 5 = 101 0.1 * 2 = 0.2 0.2 * 2 = 0.4 0.4 * 2 = 0.8 0.8 * 2 = 1.6 0.6 * 2 = 1.2 5.1 = 101.00011001100... = 1.0100011001100... x 22 Exponent = 2 + 7 in 4 bits 9 = 1001 Als voorbeeld trachten we het getal 5.1 om te zetten tot een vlottend- kommagetal in het formaat 1|4|8 met bias 7. De manier om decimale fracties om te zetten tot binaire fracties, wordt in de dia geïllustreerd, en heet “multiplication method”. Ze laat toe de binaire fractie te berekenen vanaf de meest beduidende bit. Het gaat als volgt: vermenigvuldig je (tussen)resultaat met 2 en bekom je nieuw resultaat. Is dit nieuw resultaat kleiner dan 1, onthoud dan 0 en ga verder met dit nieuw tussenresultaat. Is het nieuw resultaat groter dan 1, onthoud dan 1, en ga verder met het nieuw resultaat verminderd met 1. Is het nieuw resultaat gelijk aan 1, onthoud dan 1 en stop. Zie je een tussenresultaat dat gelijk is aan een eerder tussenresultaat, dan is er geen eindige binaire voorstelling voor deze fractie. Stop dan en herhaal het patroon dat werd “onthouden” tussen het vorige en huidige optreden van dit tussenresultaat. We schrijven het binaire getal neer dat we hebben gevonden door omzetting van het gehele deel en de fractie, en normaliseren het (schrijven als 1.fff…ff * 2E). Het bitpatroon van de exponent wordt bepaald door de gevonden E te vermeerderen met de bias. De gevonden waarden “fff…ff” worden afgekapt op 8 bits. 0100101000110 Eigenlijk: 5.09375 maar 0100101000111 is 5.109375 !
Bereik en precisie 1|8|23 1|11||52 Exponent bits 8 11 1|8|23 1|11||52 Exponent bits 8 11 Gebruikte exp’ten 255 2047 Mantisse bits 23 52 Efficiëntie 99,60% 99,95% Aantal decimalen 6-7 15-16 Bereik 10-38-1038 10-308-10308 Gehelen - Decimalen 9-10 18-19 - Bereik 0-109 0-1018 Doordat de grootste exponentwaarde niet gebruikt wordt om effectieve waarden voor te stellen gaan er een aantal mogelijkheden om waarden voor te stellen verloren. Op die manier zal men in enkelvoudige precisie slechts 99,60% van alle mogelijkheden benutten en in dubbele precisie slechts 99,95%. Het bereik van vlottende-kommagetallen is echter fenomenaal. Zij kunnen een precisie van 6-7 decimalen aanbieden over een bereik dat zich uitstrekt over 76 grootte-orden voor enkelvoudige precisie en hebben een precisie van 15-16 decimalen over een bereik van 616 grootte-orden voor dubbele precisie! Gehele getallen kunnen met zelfde aantal bits ongeveer hetzelfde aantal getallen voorstellen maar wel met een precisie van 9-10 decimalen en een bereik van 9 grootte-orden in 32 bits, en een precisie van 18-19 decimalen, en een bereik van 18 grootte-orden. De vlottende- kommavoorstelling ruilt met andere woorden precisie in voor extra bereik.
Vlottende-kommagetallen Gehele getallen die niet meer bits nodig hebben dan beschikbaar in de mantisse kunnen steeds exact voorgesteld worden (en zullen dus niet afgerond worden). Slechts een zeer klein aantal reële getallen kan exact voorgesteld worden. Alle andere worden benaderd. Testen op gelijkheid is geen goed idee. Voor wat de precisie betreft kan men in enkelvoudige precisie (32 bit) reële getallen met 6 tot 7 beduidende cijfers opslaan. In dubbele precisie (64 bit) krijgt men 15 tot 16 beduidende cijfers. Bij vlottende-kommabewerkingen kan het resultaat afhangen van de volgorde van bewerkingen. Daarom is het veiliger om nooit twee vlottende- kommagetallen op gelijkheid te vergelijken, maar steeds na te gaan of hun verschil b.v. kleiner is dan 10-6.
Afronden Er kan op vier manieren afgerond worden Naar + ∞ Naar - ∞ Naar 0 (afkappen) Naar de dichtste voorstelbare waarde +1 indien > 0,5 Afkappen indien < 0,5 Even mantisse indien = 0,5 Met enkele extra bits kan men de afronding van de berekeningen controleren. Meest logisch is om af te ronden naar de dichtst voorstelbare waarde. Speciaal hieraan is dat indien de berekende waarde even ver verwijderd is van de twee voorstelbare waarden, de even waarde gekozen wordt. Op die manier wordt vermeden dat de afronding in dezelfde richting werkt en na verloop van tijd zou beginnen accumuleren. Vlottende komma: afronden
Extra bits Om de precisie te verhogen kunnen er bij de berekening nog 3 extra bits gebruikt worden Guard bit Rounding bit Sticky bit Vlottende komma: guard bit Vlottende komma: rounding bit Vlottende komma: sticky bit Om een onderscheid te kunnen maken tussen de gevallen < 0,5 = 0,5 en > 0,5 zijn er in principe 2 extra bits nodig (om deze drie toestanden te kunnen coderen). Daarvoor kunnen bij tussenresultaten de guard bit en de rounding bit gebruikt worden. Bij sommige berekeningen kan er een normalisatie nodig zijn (naar links) waardoor enkel het rounding bit overblijft. Het sticky bit kan dan helpen om de afronding te helpen regelen. Het sticky bit wordt aangezet indien er na het R- bit nog een niet-nul bit voorkomt (b.v. tijdens het aligneren van de decimale punt bij een optelling). GRS IEEE 754
Vlottende-komma-optelling start Maak de twee exponenten gelijk aan de grootste Rond af Tel de mantissen op Genormaliseerd? Normaliseer resultaat Dit is het schema van de vlottende-komma-optelling. De verschillende gevallen worden hierna geïllustreerd. Overflow Underflow exceptie stop
Vlottende-komma-optelling 1.1111 x 23 + 1.0010 x 23 15.5 +9.0 11.0001 x 23 24.5 = 1.10001 x 24 24.5 = 1.1000 x 24 24.0 Voor een optelling of aftrekking van vlottende-kommagetallen, moeten eerst de exponenten gelijk gemaakt worden. Wanneer dit het geval is, kunnen we vrij eenvoudig de mantissen optellen. De komma heeft daarbij een vaste positie. Na de eerste stap, waarbij de mantissen worden opgeteld, moet de som opnieuw genormaliseerd worden. Daarbij schuift men zo nodig de mantisse naar rechts en incrementeert men de exponent, waarna men moet afronden, in dit geval naar een even mantisse. Wegens de beperking van het aantal bitposities in de mantisse (hier 5 bits), kan een verlies aan precisie van het resultaat optreden (hier: 24.0 ipv 24.5).
Vlottende-komma-optelling 1.1111 x 23 + 1.0010 x 21 15.5 +2.25 + 0.010010 x 23 +2.25 10.001110 x 23 17.75 = 1.0001110 x 24 17.75 In deze dia wordt geïllustreerd hoe, indien nodig, eerst de exponent van de 2 somtermen gelijk gemaakt wordt. Men stelt de exponent gelijk op de grootste waarde. Daarna telt men op en rondt men af. Opnieuw wordt in het resultaat aan precisie verloren, omdat niet alle bits van het resultaat in de mantisse kunnen bewaard worden. = 1.0010 x 24 18
Vlottende-komma-aftrekking 1.0001 x 24 17.0 -2.25 - 1.0010 x 21 - 0.0010010 x 24 -2.25 0.1110110 x 24 14.75 1.110110 x 23 14.75 Wanneer één van de 2 somtermen negatief is, gebeuren dezelfde stappen als bij de optelling van 2 positieve vlottende-kommagetallen, met dat verschil dat het verschil wordt gemaakt van de 2 mantissen (na gelijkstelling van de exponenten op de grootste van de 2), i.p.v. de som. Opnieuw toont het voorbeeld hoe precisie verloren kan gaan in het resultaat. Merk ook op hoe nu, na de aftrekking van de 2 mantissen, het tussenresultaat naar links moet verschoven worden (en niet naar rechts, zoals eerder), om het resultaat te normaliseren. Hierbij kan het goed uitkomen dat er naast de guard bit, ook nog een round bit en een sticky bit zijn om de afronding te kunnen sturen. 1.1110 x 23 15
Vlottende-komma-aftrekking 1.0010 x 24 18.0 - 1.0010 x 21 -2.25 - 0.0010010 x 24 -2.25 0.1111110 x 24 15.75 1.111110 x 23 15.75 Wanneer men, zoals in de vorige dia besproken, de mantisse afrondt, kan het soms nodig zijn het getal nadien te hernormaliseren, zoals in deze dia getoond wordt. 10.0000 x 23 16 1.0000 x 24 16
Vlottende-komma-optelling Berekeningen in vlottende-kommagetallen zijn benaderingen Bewerkingen zijn niet steeds reversibel. Associativiteit geldt niet B.v. precisie van 4 decimalen Enkele conclusies van de voorafgaande bespreking zijn dus duidelijk: berekeningen in vlottende kommagetallen zijn benaderingen. Tenzij wanneer alle resultaten (én tussenresultaten) gehele getallen zijn die voor te stellen zijn door het gebruikte vlottende-kommaformaat, of wanneer het reëel getal toevallig de som van machten van 2 zou zijn; berekeningen zijn niet altijd reversibel. Immers, als er in een tussenresultaat precisie verloren gaat, kan de inverse bewerking (wellicht) niet meer bij het originele getal terechtkomen; bewerkingen zijn niet associatief. Afhankelijk van de volgorde van bewerkingen, zal het verlies aan precisie anders zijn, en andere gevolgen hebben op het eindresultaat. Testen op gelijkheid is geen goed idee. Het is beter om na te gaan of het verschil voldoende klein is. Bij het maken van het verschil van 2 ongeveer even grote getallen kunnen grote fouten op het verschil ontstaan. 0.001 + (1000 - 1000) = 0.001 + 0 = 0.001 (0.001 + 1000) - 1000 = 1000 - 1000 = 0
Vlottende-komma-vermenigvuldiging 1.1111 x 23 x 1.0010 x 23 15.5 x 9.0 10.00101110 x 23+3 139.5 = 1.000101110 x 27 139.5 Bij vermenigvuldiging moeten de exponenten niet gelijkgesteld worden als eerste stap, zoals bij optelling. Men kan gewoon de exponenten optellen en de mantissen vermenigvuldigen. Tot slot wordt het resultaat genormaliseerd en wordt er afgerond. De tekenbit wordt berekend als de XOR van de tekenbits van de 2 producttermen. = 1.0001 x 27 136.0
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Voorstelling lettertekens ASCII = American Standard Code for Information Interchange EBCDIC = Extended Binary Coded Decimal Interchange Code UCS = Universal character set (ISO/IEC 10646) Per uniek teken: 1 code point: U+0065 = ‘e’; U+00E9 = ‘é’; U+25A0=‘■’ Lettertekens zijn een eindige verzameling van symbolen, en kunnen eenvoudig voorgesteld worden door bitpatronen, door gebruik te maken van gestandaardiseerde tabellen of codes. ASCII (American Standard Code for Information Interchange) gebruikt bitpatronen van 7 bit, en alle 128 bitpatronen stellen een letterteken voor (in de brede zin van het woord, sommige zijn leestekens of andere controlekarakters). De cijfers, hoofdletters en kleine letters komen elk voor als een aaneensluitende set, zodat alfabetische sortering eenvoudig kan uitgaan van de getalwaarde van de code. Het is ook gemakkelijk om bv. hoofdletters in kleine letters om te zetten (code +3210 of +2016). EBCDIC is een 8-bit code die dateert uit de jaren ‘60 maar ook vandaag nog gebruikt wordt in sommige computersystemen van IBM. Unicode is een evoluerende standaard die een oplossing biedt voor de beperking van ASCII, die enkel eenvoudige accentloze Latijnse lettertekens bevat. Unicode bevat een unieke codering van alle mogelijk tekens in verschillende talen aan de hand van een natuurlijk getal dat een ‘code point’ genoemd wordt (= abstract letterteken, los van enige lettertype). De laagste 128 code points komen overeen met de ASCII codering. Een font bevat een grafische voorstelling van de code points in een bepaald lettertype en wordt gebruik bij visualisatie van tekst.
Ascii-tabel 00 10 20 30 40 50 60 70 0 NUL DLE SP 0 @ P ` p 00 10 20 30 40 50 60 70 0 NUL DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 “ 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ‘ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL Ascii-tabel In de ASCII tabel zien we de gewone Latijnse karakters, de cijfers en de typische leestekens. Daarnaast zijn er een aantal controlekarakters voor de communicatie tussen verschillende randapparaten van de computer (toetsenbord, scherm, printer, …). De cijfers, hoofdletters en kleine letters komen elk voor als een aaneensluitende set, zodat alfabetische sortering eenvoudig kan uitgaan van de getalwaarde van de code. Het is ook gemakkelijk om b.v. hoofdletters in kleine letters om te zetten (code +32d of +20H).
LATIN SMALL LETTER E WITH ACUTE Coderingen U+0065 U+00E9 U+25A0 Voorstelling e é ■ LATIN SMALL LETTER E LATIN SMALL LETTER E WITH ACUTE BLACK SQUARE Decimaal 101 233 9632 UTF-8 0x65 0xC3A9 0xE296A0 UTF-16 0x0065 0x00E9 0x25A0 UTF-32 0x00000065 0x000000E9 0x000025A0 Windows Alt 101 Alt 0233 Alt 130 Alt 9632 Alt 254 C “\u0065” “\u00E9” “\u25A0” html e / e é / é ■ / ■ Tekenrijen bestaan uit een opeenvolging van codepoints. Een codepoint is een natuurlijk getal en correspondeert met één bepaald teken. Om een rij van codepoints voor te stellen in het geheugen worden ze gecodeerd. Hierbij zijn er verschillende mogelijkheden waarvan er hierboven een aantal voorgesteld worden. De minimale grootte in UTF-8 codering is 8 bit (UTF=unicode transformation format), 16 bit in UTF-16 and 32 bit in UTF-32. UTF-8 zal de codepoints vanaf 128 in twee, drie of vier bytes voorstellen. Idem voor UTF- 16 die vanaf een bepaalde waarde 32 bit zal gebruiken. Een gewone ascii- tekst kan doorgaan als een UTF-8 gecodeerde tekst. In de tabel staan ook nog de manieren om een codepoint in te geven in Windowstoepassing, C, en html.
Overzicht Logische operaties op bits en bitstrings Hexadecimale representatie Voorstelling van natuurlijke getallen Voorstelling van gehele getallen Voorstelling van reële getallen Voorstelling van lettertekens Voorbeelden
Interpretatie 10010000100100000000000000000000 Bitpatroon: 10010000100100000000000000000000 Natuurlijk getal: 242535628810 Geheel getal: -186961100810 BCD: 9090000010 Letters: ÉÉ Vlottende komma: -5.67979851 x 10-29 Alle data in een computer wordt voorgesteld door bitpatronen. Andersom kan elk bitpatroon geïnterpreteerd worden als natuurlijk getal, geheel getal, vlottende-kommagetal, lettertekens, etc! Aangezien het er meestal niet van af te lezen is, hoe men een bitpatroon moet interpreteren, moet men er door geschikte organisatie van het geheugen voor zorgen dat men weet hoe elke locatie te interpreteren (het programma dat de data gebruikt, moet het maar weten). De betekenis van een bitpatroon hangt af van de context
Enkele belangrijke getallen binair 0 255 2-compl -128 127 byte 20 = 1 21 = 2 22 = 4 23 = 8 24 = 16 25 = 32 26 = 64 27 = 128 28 = 256 binair 0 65535 2-compl -32768 32767 Woord -1 = 1111 11112 = FF16 = 1111 1111 1111 11112 = FF FF16 Deze dia toont een aantal belangrijke getallen, die tot je parate kennis moeten behoren. Het bereik van 8-bit bytes is 0–255 (natuurlijke getallen) en -128–127 (2- complement) Het bereik van 16-bit woorden is 0–65535 (natuurlijke getallen) en -32768– 32767 (2-complement) (noot dat een woord hier als 16-bit grootheid wordt gebruikt) -1 wordt in de 2-complement voorstelling voorgesteld door “allemaal 1-bitjes”.
Oefening Gegeven het bitpatroon 01100111 Wat is hiervan de waarde als Binair getal Teken-grootte notatie 1-complementgetal 2-complementgetal Verschoven representatie (bias = 50) Binair vaste komma (2 bits na komma) BCD-getal Ascii-teken Vlottende-kommagetal (1|3|4, bias=3) Maak volgende oefening om je kennis en begrip van dit hoofdstuk te testen.
Oefening Stel het getal -75 voor in 16 bits (in hex) Teken grootte notatie 1-complement 2-complement Verschoven representatie (bias = 100) BCD 9-complement BCD 10-complement Vlottende komma-getal (1|5|10, bias 15) Maak volgende oefening om je kennis en begrip van dit hoofdstuk te testen.
Pauze