Faculteit Psychologische en Pedagogische Wetenschappen ACADEMISCHE INITIËLE LERARENOPLEIDING Academiejaar 2000-2001 Vakdidactiek informatica : praktijkgerichte seminaries Lesgevers : Prof. A. Hoogewijs / Annick Van Daele Vakgroep Pure wiskunde en computeralgebra Galglaan 2 9000 Gent Tel. : 09/2644900 – Fax. : 09/2644993 – E-mail : [email protected] LES 3 : Hans OPSTAELE Talstelsels en de LOGO getallenwereld REFERENTIES Logisch Logo - Auke Sikma http://cage.rug.ac.be/~bh http://www.softronix.com/logo.html http://www.eurologo.org Machinetaal voor de Z80 Hoofdstuk 1 : Inleiding (LESFASE 1) Computers zijn machines die ‘snel rekenen’ als hun voornaamste doel hebben. Denk maar aan rekenbladen (MS Excel), simulatieprogramma’s (SPICE), enz. Daarnaast bestaan er ook programma’s waar die brute rekenkracht gebruikt wordt, maar waar dit voor een gebruiker niet voor de hand ligt: vele spelletjes vragen nogal zware processoren omdat ze een wereld in drie dimensies willen weergeven. Men zou verwachten dat de computers van tegenwoordig de elementaire wiskundige bewerkingen zonder enig probleem kunnen uitgevoeren. Toch is dit niet zo eenvoudig: denk maar terug aan de Intel PENTIUM processor die problemen had bij de deling. Ook bestaan er moderne processoren die niet kunnen vermenigvuldigen noch delen ! Bijvoorbeeld: de AVR AT92S1200 RISC processor. Hoofdstuk 2: Telman (LESFASE 2) We weten uit de vorige lessen dat LOGO gebruikt wordt in de artificiele intelligentie. Om u te introduceren in de getallenwereld van LOGO, maken we gebruik van ‘telman’. Telman is een ‘robotje’ in de computer. Hij heeft echter nog geen vingers dus kan hij nog niet tellen. Noot: De LOGO code van telman staat in de presentatie. Ons doel is om telman zijn vingers te geven en te leren tellen. Merk op dat ‘telman’ een stripfiguur is: Alle stripfiguren hebben maar vier vingers aan 1 hand. Oefening: 1. Pas de gegeven code aan zodat deze code leesbaar wordt (zie slides). 2. Programmeer een procedure ‘hand’ die aan iedere pols een hand tekent. De hand heeft nul tot vier vingers. Telman kan nu kleine getallen (van nul tot acht) tonen met zijn vingers (zie figuur 1). 2 Figure 1: Telman na het commando: “telman 3 4” Hoofdstuk 3: Talstelsels en conversies in LOGO (LESFASE 3). Om telman grotere getallen ( negen of meer) te laten tonen, doen we het volgende: Telman toont eerst de eenheden dan de tientallen, dan de honderdtallen , … Dit zijn de ‘digits’ waaruit een getal bestaat in het decimaal stelsel. Helaas is er nu een probleem: om eenheden en tientallen te kunnen tonen hebben we negen vingers nodig. Bijvoorbeeld: Het getal ‘905’ toont men door eerst vijf, dan nul en dan negen vingers te tonen. Telman heeft maar acht vingers. Hier zien we dan een decimaal stelsel niet geschikt is voor telman. Iedereen die wil rekenen moet dit kunnen doen op een manier die het voor hem het beste past. De wijze om een getal voor te stellen noemt men een talstelsel. Mensen gebruiken het decimaal stelsel. Computers kennen maar nul of een: zij gebruiken het binair stelsel. Telman heeft maar acht vingers: Hij (of zij) gebruikt het octaal stelsel. Om elkaar te verstaan moet men onderscheid maken tussen de waarde en zijn voorstelling (door middel van een talstelsel). Een getal wordt voorgesteld door een reeks digits waar de waarde van zo’n digit afhankelijk is van zijn positie en zijn basis. Denk terug aan het decimaal stelsel: De basis is hier tien. 1. positie 1: eenheden ( x 1 ) 2. positie 2: tientallen ( x 10 ) 3. positie 3: honderdtallen (x 100 = x 10 x 10 ) 4. positie 4: duizendtallen (x 1000 = x10 x10 x10) 5. … 3 Voor het octale stelsel is dit: 6. positie 1: x 1 7. positie 2: x 8 8. positie 3: x 64 = x8 x8 9. positie 4: x 512 = x8 x8 x8 10. … De decimale voorstelling van 123 (decimaal) is 1*100 + 2*10 + 3. De decimale voorstelling van 123 (octaal) is 1*64 + 2*8 + 3. 123 octaal is 83 decimaal ! Men kan dit controleren met de rekenmachine op de computer (figuur 2). Hoofdstuk 4: conversies in LOGO Hoofdstuk 4.1: Een waarde uitschrijven in een willekeurig talstelsel. We herschrijven de getallen uit het vorige hoofdstuk, als volgt: 123 (decimaal) = 1*100 + 2*10 +3 (zoals vroeger). 123 (decimaal) = (1*10 + 2) * 10 + 3 We merken dus op dat 3 de rest na deling door 10 is: Het laatste digit is dus de rest na deling door de basis. Decimaal (basis 10): rest na deling van de waarde 123 door 10: 3 Octaal (basis 8): rest na deling van de waarde 123 door 8 = 3 Binair (basis 2): rest na deling van de waarde 123 door 2 = 1 Hiermee hebben we de eenheden in een willekeurig talstelsel. 4 We zullen ons nu concentreren op de tientallen voor het decimaal stelsel (x10), de achttallen (x8) voor het octaal stelsel en de “tweetallen” (x2) voor het binair stelsel. Delen we de gegeven waarde door de basis en negeren we de rest na de deling dan is dit mogelijk ! Voorbeelden: 123 (decimaal, basis 10): 123 / 10 = 12 ( de rest is 3) 123 (octaal, basis 8): 123 / 8 = 15 ( de rest is 3) 123 (binair, basis 2): 123 / 2 = 61 ( de rest is 1) In het eerste voorbeeld zien we dat het resultaat ‘12’ is: het getal is ahw een positie naar rechts opgeschoven ! We kunnen ons nu dus concentreren op de eenheden zoals in het begin van hoofdstuk 4.1. Merk dus op dat deze procedure zichzelf terug op roept: recursie (zie les 1). We nemen de rest na deling door onze basis: Decimaal (basis 10): rest na deling van de waarde 12 door 10: 2 Octaal (basis 8): rest na deling van de waarde 15 door 8 = 7 Binair (basis 2): rest na deling van de waarde 61 door 2 = 1 We concentreren ons nu op het volgende digits (positie 3): We delen het getal en negeren de rest: 12 (decimaal, basis 10): 12 / 10 = 1 ( de rest is 2) 15 (octaal, basis 8): 15 / 8 = 1 ( de rest is 7) 61 (binair, basis 2): 61 / 2 = 30 ( de rest is 1) Voor het octale en het decimale stelsel zijn we nu ten einde. Decimaal: 1*100 + 2*10 + 3 = 123 (d) Octaal: 1*64 + 7*8 +3 = 157(o) Binair: 30*4 + 1*2 + 1, werken we dit verder uit zoals hierboven krijgt men: 1111011(b) We herhalen dus steeds twee operaties. In LOGO is dit: 1. De rest na deling: REMAINDER INT x y (x is de waarde en y is de basis). 2. Deling door de basis en het negeren van de rest: INT x / y (x is de waarde en y is de basis). Merk op dat we een ‘woord’ creeren door steeds maar weer digits toe te voegen (eerste de eenhedem, dan de tientallen , …): Het aan elkaar kleven van digits tot 1 woord gebeurd met de instructie ‘WORD’ (les 2). Op de slides staat de procedure uitgeschreven voor basis 8. To BASE8 :n 5 If :n = 0 [OP “] OP WORD BASE8 (INT : n / 8) (REMAINDER INT :n 8) end Oefening: Tik deze in en vorm ze om voor een willekeurige basis. Oefening: Test deze laatste procedure met de volgende basissen: BASE 123 2 BASE 246 2 BASE 61 2 Besluit: Voor het binair stelsel geldt: 1. De waarde x 2 (246=123*2) schuift het getal naar links op: 11110110 (b) = 246(d): vergelijk met 123(d) = 1111011 (b) 2. De waarde / 2 (61=123/2) schuift het getal naar links op: 111101 (b) = 61(d): vergelijk met 123(d) = 1111011 (b) Dit is een elementair kenmerk van de binaire getallen: een verschuiving naar links is x2 naar rechts is dit / 2. Oefening: Test het volgende: BASE 123 16 Het verkregen getal is 711 (basis 16), maar 7*256 + 1*16 + 1 is verschillend van 123 ? In feite moeten we 711 lezen als 7’11 = 7*16 + 11 = 123(d). Om deze verwarring te vermijden schrijven we 10 als ‘A’, 11 als ‘B’, … , 15 als ‘F’. 123(d) = 7B(hexadecimaal) Noot: hexadecimaal is een andere naam voor het zestientallig stelsel. Oefening: controleer dit op het rekentoestel van windows. Hoofdstuk 4.2: De waarde van een getal in een willekeurig talstelsel. Wat is de waarde van 123 (octaal) ? Wat is de waarde van 1011 (binair) ? We weten nu al dat 123(o) = 1*8*8 + 2*8 +3 is. Omzit gemakkelijker uit te rekenen herwerken we de formule als volgt: 123(o) = 12*8 + 3 Merk op dat 3 de LAATSTE digit is van het getal 123 (o) en ‘12’ is alles BEHALVE het laatste digit van het gegeven getal 123(o). 6 In LOGO: 1. Het laatste karakter van een woord: LAST (les 2) 2. Alles karakters BEHALVE het laatste van een woord: BUTLAST (of BL) (les 2) Noot: In LOGO zullen we dus een gegeven waarde als een ‘woord’ zien en de digits als karakters. Daarnet hadden we: 123(o) = 12*8 + 3 (BUTLAST “123 12 en LAST “123 3) en 12(o) = 1*8 + 2 (BUTLAST “12 1 en LAST “12 2) Dus: 123(o) = ((1*8 + 2)*8 + 3 Dit is hoe de volgende procedure werkt. Ze is terug recursief. To BBASE8 :n IF :n = “ [OP 0] OP ( 8 * BBASE8 BL :n ) + (LAST :n ) End Oefening: Zet dit om zodat de procedure werkt voor alle basissen ! Hoofdstuk 4.3: Snelle omzetting tussen het binair, octaal en hexadecimaal stelsel. Het binaire, octale en hexadecimale stelsel zijn verwant met elkaar. Bijvoorbeeld: Stel eerst een waarde binair voor: 123(d) = 1111011(b) Verdeel ze dan als volgt: Per 3 voor het octale stelsel, per 4 voor het hexadecimale stelsel. Voeg desnoods enkele nullen links toe. 1. Octaal: 1111011 001’111’011 3. Hexadecimaal: 1111011 => 0111’1011 DEFINITIE: Een reeks van 4 bits wordt een ’nibble’ genoemd. Gebruik de volgende tabel voor de omzetting: Octaal: Groep 000 001 010 011 100 101 110 111 Digit 0 1 2 3 4 5 6 7 7 Hexadecimaal: Groep 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Digit 0 1 2 3 4 5 6 7 8 9 A B C D E F Werkwijze: Vervang de groep door de betreffende digit in de tabel. Voorbeelden: Octaal: 1111011 001’111’011 173 (o) Hexadecimaal: 1111011 => 0111’1011 7B (h) Dit komt overeen men de resultaten uit het vorige hoofdstuk ! De omgekeerde richting kan ook. Men vervangt de digit door de binaire groep. A’5 (b) = 1010’0101 (b) 1’2’3 (o) = 001’010’011 (b) Men doet er dus goed aan de tabel uit het hoofd te kennen om snel te kunnen werken. Hoofdstuk 4.4: Terug naar Telman. De slides bevat de code om procedure BASE8 uit hoofdstuk 4.2 toe te passen op telman. Oefening: Tik deze code in en test ze uit op enkele getallen. Oefening: Keer de volgorde waarin telman zijn digits toont om. Bijvoorbeeld: Teller 123 laat telman 173 vingers tonen. Maak dat dit omgekeerd gebeurd: Teller 123: 371 (les 1: oefening op recursie). Door de recursie op het einde van de procedure uit te laten voeren wordt de volgorde omgekeerd. De oplossing bevindt zich in de lesoplossing (les3.lgo). 8 Hoofdstuk 5: Operaties op binaire getallen ( LESFASE 3) In de computer hebben de binaire getallen een vaste lengte: 8 bits, 16 bits, 32 bits ,… Daarom is de maximum waarde ervan beperkt. Zo zal een 8 bits binair getal na 255 (11111111(b)) ‘overlopen’, want 256 bevat 9 bits ! Daardoor zal het getal 256 terug nul zijn. De maximale waarde in een zestien bits getal is 65535 of FFFF (h). Hoofdstuk 5.1: Negatieve getallen We hebben nog geen negatieve getallen besproken. Dit komt omdat –in het binair systeemnegatieve getallen slechts een ‘interpretatie’. Voor 8 bits getallen geldt: Positieve interpretatie 255 254 253 … 129 128 Negatieve interpretatie -1 -2 -3 … -127 -128 4. Een negatieve interpretatie (N) bestaat enkel als het getal groter of gelijk is dan de helft van zijn maximale waarde plus 1 (MAX+1). 5. De negatieve waarde is dan N = P - (MAX + 1). P is de (positieve) waarde van het getal. Voorbeeld: 8 bits (MAX = 255, alle 8 bits zijn 1): 200 (groter dan 128) = -56. Test dit op de rekenmachine van windows ! Merk op dat men slecht de eerste 8 bits van rechts in rekening moet houden. Hoofdstuk 5.2: Optellen en aftrekken Het optellen in binair is identiek als het optellen in het decimaal stelsel als zou men dit handmatig doen. Decimaal: 212 193 405 9 Het schema is als volgt: 1. Ga van rechts naar links: 2. Tel de overeenkomstige digits op. 3. Tel bij het resultaat ev. 1 bij als je een overdracht had (zie stap 4). 4. Als de som groter is dan de basis (decimaal: 10) dan krijg je een ‘overdracht’ (‘carry’ in het Engels). Bvb: 1+9 = 10 (de nul blijft maar onthoud de ‘1’ voor de volgende som) Dit schema is hetzelfde voor de binaire optelling, maar de basis is 2. 1. Ga van rechts naar links: 5. Tel de overeenkomstige digits op. 6. Tel bij het resultaat ev. 1 bij als je een overdracht had (zie stap 4). 7. Als de som groter is dan de basis (binair: 2) dan krijg je een ‘overdracht’ (‘carry’ in het Engels). Bvb: 1+1 = 10(b) (de nul blijft maar onthoud de ‘1’ voor de volgende som) Voorbeeld: 0100 + 1101 = 10001 (twee overdrachten) Hoofdstuk 5.3: De binaire vermenigvuldiging De binaire vermenigvuldiging volgt hetzelfde schema als de vermenigvuldiging zoals we die kennen als we het met de hand doen. Schematisch: P = A*B 1. Zet P = 0 2. Evalueer B van de meest linkse digit naar de meest rechtse digit: 2.1 Vermenigvuldig A met de digit en tel dit bij P op 2.2 Als dit niet de meest rechtse digit is: vermenigvuldig P met de basis 10 (de basis voor het decimaal stelsel) 2.3 Herhaal punt 2 voor de overige digits van B Bijvoorbeeld: 123*456: 1. P=0 2. We evalueren B in de volgorde: 4 dan 5 dan 6 2.1 P := 0 + 123*4 = 492 2.2 P := 4920 (x10) 2.3 P := 4920 + 123*5 = 5535 2.4 P := 55350 (x10) 2.5 P := 55350 + 123*6 = 56088 2.6 P := 56088 (de meest rechtse digit van B hoeft niet x 10, zie 2.2) Een voorbeeld in binair: Dit volgt hetzelfde schema maar dan met basis 2 (zie stap 2.2). Bovendien kan een digit slechts de waarde 0 of 1 aannemen. Merk op dat de vermenigvuldiging met twee in het binair overeenkomt met een verschuiving naar links (hoofdstuk 4). 10 A*B: 0110 * 0101 (b): 1. P:= 0 2. We evalueren B in de volgorde: 0 dan 1 dan 0 dan 1. 2.1 P := 0 + 0*(0110) = 0 2.2 P := 0 (x2) 2.3 P := 0 + 1 * (0110) = 0110 2.4 P := 01100 (x2) 2.5 P := 01100 + 0*(0110) = 01100 2.6 P := 011000 2.7 P := 011000 + 1*(0110) = 011110 Noot: Het resultaat van een binaire vermenigvuldiging neemt dus meer bits in beslag dan A en B! Hoofdstuk 5.4: De binaire deling. Ook hier is de binaire deling overeenkomstig met de werkwijze zoals we die kennen als we het met de hand doen. Ze wordt echter sterk vereenvoudigd omdat een digit in het binaire stelsel slechts de waarde 0 of 1 kan aannemen. Q = DT / DR + R met: DT het deeltal en DR de deler. Het volgende schema geldt enkel voor de binaire deling: 1. Zet R := 0 2. Zet Q := 0 3. Evalueer DT van links naar rechts 3.1 Tel deze digit op bij R 3.2 Als R groter of gelijk aan DR is, trek dan DR af van R en tel 1 bij het quotiënt Q. 3.3 Als dit niet het laatste digit is, vermenigvuldig Q en R met 2 3.4 Herhaal stap 3 voor alle digits van DT Voorbeeld: 1011 / 10 ( decimaal: 11 / 2 ): 1. R := 0 2. Q := 0 3. We evalueren DT in de volgende volgorde: 1 dan 0 dan 1 en dan 1. 3.1 R := 1 3.2 R := 1 en Q := 0 (want R < DR ) 3.3 R := 10 en Q := 0 ( Q x 2 en R x 2 ) 3.4 R := 10 + 0 = 10 3.5 R := 0 ( 10 - 10 = 0 ) en Q := 1 (want R= DR ) 3.6 R := 0 en Q := 10 ( Q x 2 en R x 2 ) 3.7 R := 0 + 1 ( voorlaatste digit van DT is 1 ) 3.8 R := 1 en Q:=10 (want R < DR ) 3.9 R := 10 en Q := 100 ( Q x 2 en R x 2 ) 3.10 R := 10 + 1 (laatste digit van Q) 3.11 R := 1 (11 - 10) en Q := 101 (want R > DR ) 3.12 Geen digits meer in DT. Het resultaat: R = 1 en Q = 101(b) = 5 (d) 11 Dus: 11 / 2 = 5 rest 1 Hoofdstuk 6: Vlottende komma getallen Vlottende komma getallen kennen in de computer een gelijkaardige voorstelling als de ‘wetenschappelijke representatie’ die we kennen voor onze komma getallen. Bvb: 123 = 1.23 E 2 (1.23 x 102) Een getal wordt opgesplitst in twee delen: de mantisse ( 1.23 ) en de exponent ( 2 ). In het binaire stelsel is de basis niet 10 maar 2, dus: 01110 = 0.1110 E 1000 (mantisse 0.1110, exponent 1000 ) Een vlottend komma getal heeft terug een beperkte grootte (een beperkt aantal bits): 80 bits is een courante grootte. Dit heeft als gevolg dat terug niet alle getallen kunnen voorgesteld worden: Het getal heeft een beperkte nauwkeurigheid. Oefening: Sin 360 is niet 0 ! Uittesten op de computer. Hoofdstuk 7: Beeldverwerking in LOGO Aangezien dit hoofdstuk niet in de les gegeven werd is ze weggelaten uit de cursus. 12 13