INF1040 løsningsforslag oppgavesett 7: Tall og geometrier (Kapittel 7.1, 7.4-7.8, 8 + Appendiks B) Hvis du finner feil i løsningsforslaget er det fint om du gir beskjed om dette ved å sende en mail til martingi@ifi.uio.no Tenk selv -oppgaver 24. Det oktale tallsystemet I det oktale tallsystemet er grunntallet 8. (a) Hvilke sifre brukes i dette tallsystemet? 0, 1, 2, 3, 4, 5, 6, 7 (b) Skriv tallene fra 0 10 til 7 10 både binært og oktalt, og sammenlign med den tilsvarende tabell for heksadesimale tall på side 3 i læreboken. Binær notasjon Oktal notasjon 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 Dette tilsvarer øverste halvdel av tabellen på side 3, hvis vi holder over første siffer (0) i den binære notasjonen. (c) Hvor mange oktale sifre trengs for å representere et bitmønster på 8 biter? Hvor mange heksedesimale sifre trengs for dette? Hvert oktale siffer tilsvarer tre biter, mens hvert heksadesimale siffer tilsvarer fire biter. Vi trenger altså 3 oktale eller 2 heksadesimale sifre for å representere 8 biter. (d) Hvor mange oktale sifre trengs for å representere et bitmønster på 32 biter? Hvor mange heksedesimale sifre trengs for dette? 11 oktale sifre, 8 heksadesimale. 1
25. Representasjon av heltall og litt regning I denne oppgaven skal du anta at du arbeider med en datamaskin der heltall er representert med åtte (8) biter. (a) Hvilket tallområde kan representeres under forutsetning av at du ikke skal representere negative tall? [0,...,255] (b) Hvilket tallområde kan representeres under forutsetning av at negative tall skal representeres som toerkomplementer? [ 128,..., 127] (c) Hva er den binære representasjonen for 77? 01001101 (d) Hva er toerkomplement binære representasjonen for -66? 10111110 (e) Utfør en binær addisjon av tallene 77 og -66 i toerkomplement-systemet. Kontroller svaret! 01001101+10111110 = 100001011. Stryker overflytsbiten og får 1011, altså 11 10. (f) Utfør en binær addisjon av 77 med seg selv i toerkomplement-systemet. 01001101 + 01001101 = 10011010, som tilsynelatende er 154 10. Men siden tallet begynner med 1, er det representasjonen for det negative tallet 102 10. Vi har fått en overflyt, hvilket kan fastslås ut fra at de to mentene lengst til venstre er ulike. 154 10 er utenfor det representerbare tallområdet. (g) Utfør en binær addisjon av -66 med seg selv i toerkomplement-systemet. 10111110 + 10111110 = 101111100, stryker 1 bit og får 01111100, som er 124 10. Vi har igjen en overflyt, hvilket kan fastslås ut fra at de to mentene lengst til venstre er ulike. 132 10 er utenfor det representerbare tallområdet. 26. Litt mer binærregning Ta de fire desimalsifrene i din fødselsdag (månedsnummeret skjøtt sammen med dagnummeret, for eksempel: 12. januar = 0112). (a) Konverter dette tallet til et binært tall. Vi kaller dette tallet A. Vi gjennomfører regnestykket med tallet 0112. 0112 = 0111 0000 (A) (b) Multipliser A med 2. Vi kaller dette tallet B. Bare skift binærtallet en plass mot venstre: 1110 0000 (B) (c) Dann toerkomplementet av A (du må gjøre en antagelse om hvor mange biter du vil bruke for dine heltall). Vi kaller dette tallet C. 1000 1111 + 1 = 1001 0000 (C) 2
(d) Adder B og C - vi kaller resultatet D. 1110 0000 + 1001 0000 = 1 0111 0000, kast overløpsbiten: 0111 0000 (D) (e) Konverter D tilbake til desimaltall. 0111 0000 binært tilsvarer 64+32+16 = 112 (!) i titallsystemet. 27. Regning med tall på tekstform Vi vet at tall kan representeres på to høyst ulike måter: Enten på binær form eller som tekst. Den første formen brukes fortrinnsvis for lagring og beregninger, den andre fortrinnsvis i forbindelse med input/output eller når tallet inngår som en integrert del av en tekst. I programmeringsspråket COBOL (Common Business Oriented Language) er det imidlertid vanlig å regne med tall på tekstform, fordi bruksområdet gjør at mengden av regning er relativt beskjeden sammenliknet med mengden av teksthåndtering, og det ofte ikke lønner seg å konvertere tallene fram og tilbake mellom tekstform og binærform. Skisser en algoritme for å addere to ikke-negative tall på tekstlig form. Anta at kodingen er ISO-8859-1 eller Unicode UTF-8. Prøv algoritmen eksempelvis på å addere desimaltallet 73 med seg selv. Vi viser algoritmen med tallet 73. ISO-8859-1 og UNICODE UTF-8-representasjonen er 0011 0111 0011 0011. Vi adderer friskt i vei: 0011 0111 0011 0011 + 0011 0111 0011 0011 = 0110 1110 0110 0110. Vi vet at vi her har en bias på 0x30, altså 0011 0000, som vi må trekke fra: 0110 1110 0110 0110-0011 0000 0011 0000 = 0011 1110 0011 0110. Nå er det siste sifferet i svaret allerede på plass, siden det ikke ble generert noen mente: 0011 0110 er UTF-8-koden for tegnet 6. Men det først sifferet er kommet utenfor det tillatte området: Det er større enn representasjonen for 9, som er 0x39. Vi har altså en mente. Vi må trekke fra 0xA = 1010: Vi regner ut 0011 1110-1010 = 0011 0100, som er UTF-8-koden for tegnet 4. Så må vi altså ta hånd om menten ved å addere den til representasjonen for tegnet 0, altså 1 + 0011 0000 = 0011 0001, som er UTF-8-representasjonen for tegnet 1. 3
28. Representasjon av flytende tall (litt avansert mest for spesielt interesserte) Før du prøver deg på denne oppgaven, kan det lønne seg å studere konverteringsrutinen på http://www.randelshofer.ch/fhw/gri/float.html#chapterfloatapplet Anta at du har en representasjon av et flytende tall i henhold til prinsippene i IEEE Standard 754, men med bare 8 biter og følgende layout: Fortegnsbit: 1 bit Eksponent: 3 biter bias 3 Mantisse 4 biter For å forenkle ting, antar vi at vi kun opererer med normaliserte mantisser. Eksponenten kan anta de desimale verdiene fra 3 til -3. På grunn av biasen blir -3 lagret som 000, -2 som 001, -1 som 010, 0 som 011, 1 som 100, 2 som 101, 3 som 110. Husk at en eksponent med bare 1ere blir brukt for spesielle formål (uendelig, Not a Number). Derfor kan eksponentdelen av tallet ta verdier fra 2 3 til 2 3, dvs. fra 1 8 til 8. Den første biten i mantissen blir ikke lagret. Derfor er den største mantissen binær 1.1111. Den minste normaliserte mantissen er vanligvis 1.0000. Imidlertid har vi de spesielle tilfellet at 0 representeres med alle biter lik 0. Derfor: I forbindelse med eksponent -3 som er representert som 000, er den minste normaliserte mantissen 1.0001. (a) Hva er det største positive tallet som kan representeres? 8 (1 + 1 2 + 1 4 + 1 8 + 1 ) = 8 1, 9375 = 15, 5 16 (b) Hva er det ikke-representerbare området rundt 0?. Det minste positive tall forskjellig fra 0 er 1 8 (1 + 1 ) = 0, 1328125 16 Det ikke-representerbare området blir fra -0,1328125 til +0,1328125, disse verdiene ikke inkludert. 29. Vektorrepresentasjoner Hvor få tall kan vi greie oss med i en vektorrepresentasjon for å kunne beskrive (a) en kule? Koordinattrippelet for senteret (dvs. 3 tall), samt radien. Tilsammen 4 tall. 4
(b) et kuleskall? Samme som a. Det er bare regelen for avledning av punktmengden som er forskjellig. (c) en trekant i et todimensjonalt rom? Tre koordinatpar, altså 6 tall. (d) en trekant i et tredimensjonalt rom? Tre koordinattripler, altså 9 tall. (e) en sirkel i et todimensjonalt rom? Koordinatparet for senteret, samt radien. Tilsammen 3 tall. (f) en sirkel i et tredimensjonalt rom? Koordinattriplet for senteret pluss to vinkler for å gi orienteringen, samt radien. Tilsammen 6 tall. 30. Skjæringspunktet mellom to linjer Vi har to rette linjer i et todimensjonalt kartesisk koordinatsystem, linje A går gjennom punktene (0,3) og (4,3) og ligger dermed parallelt med x-aksen, linje B går gjennom punktene (0,0) og (4,4) og har dermed en vinkel på 45 grader med x-aksen. (a) I en graf er det lett å se hvor linjene krysser hverandre, men hvordan kan vi finne skjæringspunktet ut fra en vektorrepresentasjon der vi kjenner de fire punktene ovenfor? Vi setter opp likninger for de to linjene: A : y = 3 B : y = 4 0 4 0 x = x Setter de to likningene lik hverandre of får x = 3, setter inn i likningen for B of går y = 3. Hele poenget her er at vi må regne litt for å finne skjæringspunktet. (b) Hvordan kan vi finne skjæringspunktet ut fra en rasterrepresentasjon der rasterpunktene er kvadrater med sidelengde 1? Begge linjer er representert som en mengde av rasterpunkter hvis beliggenhet er direkte eller indirekte gitt gjennom koordinatpar. Vi trenger bare å finne det koordinatparet som er felles for begge mengder. (c) Vi vrir linje B slik at den går gjennom (0,0) og (5,4). På grunn av diskretisering skal skjæringspunktet fremdeles ha heltallskoordinater. Hva skjer med de rette linjene A og B? De får knekkpunkter i krysninspunktet og vil derfor forskyve seg. Dette kan føre til topologiske feil overfor punktobjekter (på et kart ligger kirken plutselig på motsatt side av veien!) Se eksempelet nedenfor, 5
der det hvite punktet på grunn av diskretiseringen kommer til å ligge på istedenfor ved siden av linjen. I GIS-systemer finnes det teknikker (Realms og ROSE-algebra) for å motvirke slike uheldige virkninger av diskretisering. 31. Representasjon av en kube Vi har en kube der det ene hjørnet ligger i origo og sidekantene strekker seg 3 enheter utover langs x, y og z-aksen. (a) Hva er det minste antall punkter vi trenger å kjenne til for denne kuben i vektorrepresentasjon? 2, for eksempel (0,0,0) og (3,3,3). (b) Anta at vi i rasterrepresentasjon bruker terninger der sidekanten er 1 enhet. Hvor mange slike terninger trengs for hele kuben? 3*3*3=27. (c) Hvor mange trekanter trengs for å beskrive kubens overflate i et Triangulated Irregular Network (TIN)? Alle sidene (som er kvadrater) må deles i to trekanter, altså 6*2=12. (d) Hvor mange tetrahedrons (volumer som er avgrenset med fire trekanter, altså en slags tredimensjonal TIN) trengs for å representere volumet av kuben? Dette er lettes å anskueliggjøre ved hjelp av en fysisk modell. med litt intelligent oppdeling greier vi oss med 5 tetrahedrons. 6