Getallen.

De getallen die de mens gebruikt.

Wat betekent het getal 5716.08 ? Merken we eerst en vooral op dat we hier het Angelsaksische decimale punt gebruiken i.p.v. de decimale komma. De waarde van dit getal is voor de mens duidelijk : de waarde van de cijfers en de waarde van de plaatsen van die cijfers zijn ons van kindsbeen af bekend. Laat ons dat getal toch eens uiteenrafelen. De mens gebruikt 10 cijfers : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. En we hebben de plaatsen van de cijfers een naam gegeven : eenheden, tientallen, honderdtallen, ... voor de decimale punt en tienden, hondersten, duizendsten, ... erna. De waarde van het getal in ons voorbeeld wordt daarmee als volgt berekend : 5716.08 = 5 * 1000 + 7 * 100 + 1 * 10 + 6 * 1 + 0 * 1/10 + 8 * 1/100 Hierbij is de * het teken voor de vermenigvuldiging. Anders geschreven : 5716.08 = 5 * 10^3 + 7 * 10^2 + 1 * 10^1 + 6 * 10^0 + 0 * 10^-1 + 8 * 10^-2 Hierbij is de ^ het teken voor de machtsverheffing. Het talstelsel waarmee de mens gewoonlijk werkt is het tientallige stelsel (decimale stelsel). De basis van dat stelsel is 10, er zijn tien cijfers (0..9) en de waarden van de plaatsen in het getal zijn machten van 10. De niet gebruikte plaatsen voor en achter het getal mag je aanvullen met nullen : 5716.080, 005716.08, ...

De getallen die de computer gebruikt.

De computer gebruikt slechts twee cijfers : 0 en 1. Dit heeft te maken met het feit dat dit gemakkelijk in elektronische schakelingen is te implementeren. De computer werkt met het tweetallige stelsel (binaire stelsel). De basis van dat stelsel is 2, er zijn twee cijfers (0..1) en de waarden van de plaatsen in het getal zijn machten van 2. Laten we eens het getal 1101.01 uiteenrafelen. 1101.01 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 + 0 * 2^-1 + 1 * 2^-2 of nog : 1101.01 = 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1 + 0 * 1/2 + 1 * 1/4 In het tientallige stelsel is dat dus : 13.25 Werken met binaire getallen is voor de computer heel gemakkelijk, voor de mens heel moeilijk. Wat een geluk dat de mens niet met binaire getallen moet werken !

Bits, bytes en andere.

De getallen waar de computer intern mee werkt noemen we binaire getallen. Dit zijn op zich heel gewone getallen, alleen de manier van voorstellen is anders. De cijfers 0 en 1 noemen we bits. Dit komt van het Engelse binary digit. In het geheugen van de computer bevinden zich een enorm aantal bits. Om dit voor de mens een beetje duidelijk te maken zullen we ze groeperen. Een groepje van 8 bits samen noemen we een byte. Een groep van 1024 bytes is een kilobyte (k). Een groep van 1024 * 1024 bytes of 1024 kbyte of 1048576 bytes is een megabyte (M), 1024 Mbyte is een gigabyte (G). De factor 1024 is afkomstig van de waarde van 2^10. Bepaalde kleine groepen bits hebben ook een eigen naam : 4 bits : 1 nibble ; 16 bits : 2 bytes = 1 word (Engels voor woord) ; 32 bits : 4 bytes, 2 words, 1 double word ; 64 bits : 8 bytes, 4 words, 2 double words, 1 quad word.

De getallen die de ingenieur gebruikt.

Soms is het nuttig om in termen van binaire getallen te denken. Om dit een beetje vlotter te laten verlopen is nog een ander talstelsel in gebruik geraakt. De basis van dat stelsel is 16, er zijn zestien "cijfers", (0..9 en A, B, C, D, E, F) en de waarden van de plaatsen in zo'n getal zijn machten van 16. Dit talstelsel noemen we het hexadecimale stelsel. Dit stelsel is vooral nuttig omdat getallen er even compact mee genoteerd worden als met het decimale stelsel, maar ook omdat er een gemakkelijke omzetting bestaat tussen het hexa- decimale stelsel en het binaire stelsel en omgekeerd.
binair hex 10t.
000000
000111
001022
001133
 
binair hex 10t.
010044
010155
011066
011177
 
binair hex 10t.
100088
100199
1010A10
1011B11
 
binair hex 10t.
1100C12
1101D13
1110E14
1111F15
Elke nibble wordt vertaald naar één hexadecimaal cijfer. Probeer als oefening eens aan te tonen dat de volgende getallen alle dezelfde waarde hebben : - binair getal : 1000111011 - hexadecimaal getal : 23B - decimaal getal : 571 Het binaire getal schrijf je best op als 10 0011 1011.

Een ouder talstelsel.

Het octale of achttallige stelsel wordt maar weinig meer gebruikt. De basis van dat stelsel is 8, er zijn acht cijfers, (0, 1, 2, 3, 4, 5, 6 en 7) en de waarden van de plaatsen in zo'n getal zijn machten van 8 : 1, 8, 64, ... Omzetting van het octale naar het decimale stelsel. Voorbeeld : Octaal 167 is decimaal 119. We berekenen dit als volgt : 1 * 64 -> 64 + 6 * 8 -> + 48 + 7 * 1 -> + 7 ==== 119 decimaal Omzetting van het decimale naar het octale stelsel. Voorbeeld : Decimaal 250 is octaal 372. We berekenen dit als volgt : 250 / 8 = 31 rest 2 31 / 8 = 3 rest 7 3 / 8 = 0 rest 3 --- 372 octaal Het octale stelsel stamt uit de tijd dat er met "bytes" van 6 bits werd gewerkt, waardoor zo'n byte met 2 octale cijfers kon worden voorgesteld.

Natuurlijke getallen.

Dit zijn getallen zonder teken en zonder decimaal punt. Wat is het bereik van een natuurlijk getal, t.t.z. het aantal getallen dat kan voorgesteld worden met een bepaald aantal bits ? Bekijken we bv. een byte (8 bits). Het laagste getal is : 00000000. Decimaal is dat 0. Het hoogste getal is : 11111111. Je kunt zelf narekenen dat dit getal decimaal gelijk is aan 255. Het bereik van een 8-bits natuurlijk getal is dus [0 .. 255]. In dit bereik zijn er 256 verschillende getallen. In de wiskunde bewijst men dat het getalbereik met n bits gelijk is aan : [0 .. 2^n - 1]. Er zijn 2^n verschillende getallen in dat bereik.

Gehele getallen.

Dit zijn getallen met teken maar zonder decimaal punt. De meeste gebruikelijke notatie voor gehele getallen is de 2-complement-plus-1 notatie. Het meest linkse bit wordt gebruikt als tekenbit. Een tekenbit 0 stelt een positief getal voor, een tekenbit 1 een negatief getal. Bekijken we eerst weer een byte. Het bereik van de positieve getallen loopt van 00000000 tot en met 01111111. Dit is decimaal [0 .. 127]. Het binaire getal 10000000 beschouwt men niet als -0, want dan zou het decimale getal 0 twee verschillende voorstellingswijzen hebben, namelijk 00000000 en 10000000. Hoe berekent men dan de negatieve getallen ? Ziehier de werkwijze : - noteer het getal, zonder teken, onder binaire vorm ; - inverteer het getal (0 wordt 1, 1 wordt 0) ; - tel er 1 bij op ; het resultaat is het overeenstemmende negatieve getal. Voorbeeld : hoe schrijven we -38 ? - 38 binair in 8 bits is : 00100110 - dit inverteren geeft : 11011001 - 1 bij optellen geeft : 11011010 ; dit stelt -38 voor. Omgekeerd volgen we dezelfde werkwijze : - Als je weet dat de volgende 8 bits een geheel getal voor- stellen, wat is dan de decimale waarde van 11011010 ? - inverteer het getal : 00100101 - tel er 1 bij op : 00100110 - dit is decimaal 38, het originele getal was dus -38. Dit lijkt nogal ingewikkeld, maar in de praktijk kunnen de elektronische schakelingen van de computer hier zeer snel mee rekenen. Vandaar het grote succes van de 2-complement-plus-1 notatie. Op deze wijze kan men narekenen dat het kleinste negatieve getal binair 10000000 is ; dit is decimaal -128. Het grootste negatieve getal is 11111111 of decimaal -1. Het getalbereik van de negatieve getallen met 8 bits is dus [-128 .. -1]. Het getalbereik van een byte, indien het een geheel getal voorstelt, is zodoende [-128 .. 127], dus alle negatieve en positieve getallen samen. In dit bereik zijn er eveneens 256 verschillende getallen. In het algemeen bewijst men dat het bereik van de gehele getallen met n bits gelijk is aan [-2^(n-1) .. +2^(n-1) - 1]. Er zijn eveneens 2^n verschillende getallen in dat bereik.

Kommagetallen.

Er bestaan 2 soorten kommagetallen : - getallen met vaste komma (vast decimaal punt) ; - getallen met vlottende komma (vlottend decimaal punt). Het is deze laatste soort die in de computer toegepast wordt. T.t.z. het aantal cijfers voor en/of na de komma is niet bepaald. Bekijken we eerst 3 decimale voorbeelden : een heel groot getal, een heel klein getal en een heel bekend getal. Voorbeeld 1. Wat is de gemiddelde afstand van de aarde tot de zon in meter ? Dit is ongeveer 149658721477 m. Dit is een moeilijk te behandelen getal door het grote aantal cijfers. Maar als we het met minder cijfers willen schrijven, dan heeft dat 2 gevolgen. Ten eerste verliest men een aantal cijfers, dus het getal is minder nauwkeurig. Hoe meer cijfers men ter beschikking heeft, hoe nauwkeuriger men kan werken. Ten tweede moet men dan bijkomend aanduiden hoeveel cijfers er weggevallen zijn tot aan de decimale punt. Zo kan men schrijven dat de afstand tussen aarde en zon gelijk is aan 150 m, met nog 9 posities tot aan de decimale punt. De wetenschappelijke notatie hiervoor ziet eruit als volgt : 150 * 10 ^ 9 of nog 150E+09. Genormaliseerd wordt dit 0.15E+12. Er zijn enkel cijfers 0 voor de komma en een niet 0 cijfer onmiddellijk na de komma. Voorbeeld 2. Wat is de grootte van één enkele transistor in de Pentium Pro- chip in vierkante millimeter ? Dit getal ziet er is ongeveer zo uit : 0.00005564909210143. Ook dit getal gaan we liever genormaliseerd zien en met minder cijfers. Ook hier verliezen we nauwkeurigheid. Bovendien moeten we aanduiden hoever naar links we de decimale punt moeten verplaatsen (en aanvullen met nullen). We schrijven dus : 5.56E-05. Dit is 5.56 * 10 ^ -5. Voorbeeld 3. Bij de berekening van bv. de omtrek van een cirkel hebben we een heel bekend getal nodig, namelijk PI. Dit is ongeveer gelijk aan 3.14159265358979323846264338327950288... De ... duiden aan dat we dit getal nooit volledig correct kunnen noteren. We zullen dus steeds een verlies aan nauwkeurigheid hebben. Alleen is het de vraag hoe correct we het resultaat willen, of m.a.w. hoeveel cijfers we zullen gebruiken als we PI moeten voorstellen. Het is in alle 3 de gevallen belangrijk op te merken dat de computer ook deze soort getallen binair zal opslaan in een aantal bytes. Veel gebruikte standaarden hierbij zijn de IEEE-754 (met een 32-bits formaat) en de IEEE-1985 (met 64 bits). Telkens wordt een tekenbit voorzien, respectievelijk 8 en 11 bits voor de exponent van 2 en respectievelijk 23 en 52 bits voor het getal zelf. Dit getal wordt genormaliseerd voorgesteld en de exponent overeenkomstig aangepast. Merk op dat het getal opgebouwd wordt uit negatieve machten van 2 (1/2, 1/4, 1/8, 1/16, ...) in plaats van de voor de mens gebruikelijke negatieve machten van 10 (1/10, 1/100, 1/1000, ...). Dit betekent wel dat de afrondingen voor de computer anders zullen gebeuren dan voor de mens. Dit kan tot onverwachte resultaten leiden in computerprogramma's ! Er zijn ook een aantal combinaties van respectievelijk 32 en 64 bits die géén vlottende komma getal voorstellen, zoals +Infinity en -Infinity (+ en - oneindig) en Nan (Not a Number of Geen Getal).

Karakters.

Karakters (letters, cijfers, leestekens, ...) worden in het geheugen van de computer ook opgeslagen als getallen. Er zijn 2 coderingen zeer actueel. ASCII (American Standard Code for Information Interchange) is de eerste vorm van karaktercodering. Dit was oorspronkelijk een 7-bits codering. Karakters kregen de waarden [0 .. 127]. Het bereik [0 .. 31] bevat een aantal controlekarakters (bv. beep, nieuwe lijn, ...). Het bereik [32 .. 127] bevat leestekens, cijfers en hoofdletters en kleine letters, doch enkel voor Amerikaanse tekst, dus bv. geen letters met accenten. In de moderne computers gebruikt men meestal minimaal 8 bits, zodat de ASCII-tabel werd uit- gebreid met het bereik [128 .. 255]. De karakters die hiermee overeenstemmen zijn platform-afhankelijk. Op een PC hangen ze af van de in DOS of Windows ingestelde code pagina. Klik hier voor een ASCII-tabel. UNICODE is de tweede vorm van karaktercodering. Dit is een 16-bits encodering voor de meeste karakters die in de verschillende schriften ter wereld gebruikt worden. De klassieke 7-bit ASCII is er ook in terug te vinden, en wel met dezelfde getalwaarden. De letters met accenten hebben een eigen plaats gekregen. Zie http://www.unicode.org voor meer informatie. Voor meer informatie over karakter-codes, klik hier.

Opmerking.

Als men in het geheugen van de computer een bitpatroon vindt, wat is dan de betekenis hiervan : natuurlijk of geheel getal, kommagetal, karakter, ... ? Antwoord : dat kun je niet weten. Je kunt dat alleen weten als je het programma bestudeert dat het bitpatroon in het geheugen geschreven heeft of er terug uitleest. Men zegt dat een bitpatroon in het geheugen anoniem is.

In Java.

signed getallen

Er zijn in Java 4 getaltypes die gehele getallen voorstellen :

byte

8 bits ; bereik [-128 .. +127].

short

16 bits ; bereik [-32768 .. 32767].

int

4 bytes (32 bits) ; bereik [-2.147.483.648 .. 2.147.483.647].

long

8 bytes (64 bits) ; bereik [-2^63 .. 2^63 - 1] of [-9223372036854775808 .. 9223372036854775807].

unsigned getallen

Er is in Java slechts één type dat natuurlijk getallen voor- stelt.

char

Dit is een 16-bits type zonder tekenbit en wordt niet als getal gebruikt ; het stelt de verzameling UNICODE-karakters voor. Het getalbereik is [0 .. 65535]. Wenst men met ASCII-karakters te werken, dan moet men het type byte gebruiken.

floating point getallen

float

Voldoet aan de standaard IEEE 745 (32 bits). Bereik ongeveer [-3.4E+38 .. 3.4E+38], met uitzondering van de getallen met absolute waarde kleiner dan ongeveer 1.4E-45. Wordt naar buiten toe gepresenteerd in decimale notatie met een 7-tal beduidende cijfers.

double

Voldoet aan de standaard IEEE 1985 (64 bits). Bereik ongeveer [-1.8E+308 .. 1.8E+308], met uitzondering van de getallen met absolute waarde kleiner dan ongeveer 4.9E-324. Wordt naar buiten toe gepresenteerd in decimale notatie met een 15-tal beduidende cijfers. Enkele links (okt. 2001) met wiskundige achtergrond : http://www.scism.sbu.ac.uk/jfl/Appa/appa2.html http://www2.hursley.ibm.com/decimalj http://www.uni-ulm.de/admin/doku/javaspec/javaspec_10.html

Auteur.

Luc Vanzieleghem, CVO Westhoek-Westkust, augustus 2001.