811120P Diskreetit rakenteet 2016-2017 2. Lukujen esittäminen ja aritmetiikka
2.1 Kantajärjestelmät ja lukujen esittäminen Käytettävät lukujoukot: Luonnolliset luvut IN = {0,1,2,3,... } Positiiviset kokonaisluvut IN + = {1,2,3,... } Kokonaisluvut Z = {...,-3,-2,-1,0,1,2,3,...} Rationaaliluvut Q Reaaliluvut IR x P(x) x P(x) Rationaaliluku muotoa p /q, missä p Z ja q IN + Reaaliluvut kymmenjärjestelmässä numerojonona joukosta {0,1,2,..., 9}, negatiivisen luvun edessä miinusmerkki, desimaalipilkku tarvittaessa Irrationaaliluku on reaaliluku, joka ei ole rationaaliluku 811120P Diskreetit rakenteet, Lukujen esittäminen 2
2.1.1 Kymmenjärjestelmä Kymmenjärjestelmä paikkaan perustuva, kantaluku 10 Jokaisella jonon numerolla paikka-arvo:..., 10 3, 10 2, 10 1, 10 0 =1,.,10-1, 10-2, 10-3,... Desimaaliluvun arvo: kerrotaan kukin numero paikkaarvollaan ja lasketaan saadut luvut yhteen 2386.75 = 2 10 3 + 3 10 2 + 8 10 1 + 6 10 0 + 7 10-1 + 5 10-2 Oikeaa puolta sanotaan luvun 2386.75 laajennetuksi esitykseksi 811120P Diskreetit rakenteet, Lukujen esittäminen 3
2.1.2 Binaarijärjestelmä Luonnollisin kantajärjestelmä tietokoneissa (tietokoneissa data muodossa, jota helppo merkitä symbolein 0 ja 1) Kantaluku 2, numerot joukosta {0,1} 1101.01 2 = 1 2 3 + 1 2 2 + 0 2 1 + 1 2 0 + 0 2-1 + 1 2-2 = 8+4+1+0.25 = 13.25 10 Muunnos 10-järjestelmään helppo laskemalla auki Miten muunnos toisinpäin? Kokonaisluvun viimeinen bitti 0, jos luku parillinen ja 1, jos luku pariton -> Algoritmi: Lasketaan toistuvasti jakojäännös 2:n suhteen ja jaetaan luku kahdella 811120P Diskreetit rakenteet, Lukujen esittäminen 4
2.1.2 Binaarijärjestelmä (2) Algoritmi luonnollisen luvun muuntamiseksi binaarijärjestelmään n mod 2 jakojäännös jaettaessa kahdella n div 2 kokonaisosa jaettaessa kahdella Input: Luonnollinen luku n Output: Luvun n binaariesitys lopusta alkuun tulostettuna MUUNNA_BIN(n) 1. do 2. print n mod 2 3. n = n div 2 4. while n!=0 811120P Diskreetit rakenteet, Lukujen esittäminen 5
2.1.2 Binaarijärjestelmä (3) Miten muunnetaan desimaaliluvun murto-osa? Jos desimaaliluvun murto-osa on alle 0.5, niin binaariesitys alkaa 0.0, muuten se alkaa 0.1 Näin saadaan algoritmi: Kerrotaan murto-osaa toistuvasti kahdella. Jos syntyy kokonaisosa, poistetaan se ja merkitään esitykseen 1, muuten esitykseen 0. Merkintöjä: x on reaaliluvun x kokonaisosa ( 2.7 =2) frac(x) on reaaliluvun x murto-osa (frac(2.7)=0.7) 811120P Diskreetit rakenteet, Lukujen esittäminen 6
2.1.2 Binaarijärjestelmä (4) Algoritmi: desimaaliluvun murto-osa binaarijärjestelmään Input: Murto-osa x, numeroiden lukumäärä d Output: Luvun x binaariesitys tulostettuna MUUNNA_MURTO_BIN(x,d) 1. print 0. 2. i = 0 3. do 4. i = i+1 5. y = 2*x 6. print y 7. x = frac(y) 8. while (x!=0 and i!=d) 811120P Diskreetit rakenteet, Lukujen esittäminen 7
2.1.2 Binaarijärjestelmä (4) Tehtävä: Muunna kymmenjärjestelmän luku 122.284 binaarijärjestelmään niin, että desimaalipisteen jälkeen tulee kuusi numeroa Vastaus: 1111010.010010 811120P Diskreetit rakenteet, Lukujen esittäminen 8
2.1.2 Oktaali- ja heksadesimaalijärjestelmät x P(x) x P(x) Oktaalijärjestelmässä kantaluku 8 -> Luvut esitetään numeroilla {0,1,,7} Heksadesimaalijärjestelmässä kantaluku 16 -> Luvut esitetään numeroilla {0,1,,9,A,B,C,D,E,F} Kumpikin usein käytössä tietotekniikassa Algoritmit desimaalijärjestelmästä muuntamiseksi samankaltaiset kuin binaarimuunnos: kantaluku 2 korvataan 8:lla tai 16:lla Binaariluvun muuntaminen 8- tai 16-järjestelmään suoraviivaista 811120P Diskreetit rakenteet, Lukujen esittäminen 9
2.1.2 Oktaali- ja heksadesimaalijärjestelmät x P(x) x P(x) Tehtävä 1: Muunna luvut 752.15 8 ja B19.A3 16 binäärijärjestelmään Vastaus: 111101010.001101 ja 101100011001.10100011 Tehtävä 2: Muunna luku 1001001010.10011 2 sekä oktaali- että heksadesimaalijärjestelmään Vastaus: 1112.46 8 ja 24A.98 16 Tehtävä 3: Muunna kymmenjärjestelmän luku 122.284 sekä oktaali- että heksadesimaalijärjestelmään niin, että desimaalipisteen jälkeen tulee kolme numeroa Vastaus: 172.221 8 ja 7A.48B 16 811120P Diskreetit rakenteet, Lukujen esittäminen 10
2.1.3 Merkitsevät numerot Desimaaliluvuilla ilmaistaan reaalilukuja ja niiden likiarvoja Merkitsevien numeroiden määrä ilmaisee tarkkuuden Sääntö merkitsevien numeroiden määrälle: 1. Desimaaliluvun alussa olevia nollia ei lasketa merkitseviksi numeroiksi; 2. ilman desimaalipilkkua esitetyn luvun lopussa olevia nollia ei lasketa merkitseviksi numeroiksi; 3. kaikki muut luvussa esiintyvät numerot ovat merkitseviä. 811120P Diskreetit rakenteet, Lukujen esittäminen 11
2.1.3 Merkitsevät numerot (2) Esimerkkejä: Luku 75000; kaksi merkitsevää numeroa Luku 0.002340; neljä merkitsevää numeroa Luku 12.0076; kuusi merkitsevää numeroa 811120P Diskreetit rakenteet, Lukujen esittäminen 12
2.2 Lukujen tietokone-esitys Luvut tietokoneessa kiinteänpituisina bittijonoina Kokonaislukuja käsitellään eri tavalla kuin muita reaalilukuja -> käsitellään erikseen Kokonaisluvut tallennetaan tavuina Tavu koostuu kahdeksasta bitistä Tässä tarkastellaan kaksitavuisia kokonaislukuja, periaatteet täysin samat kuin useampitavuisissa tapauksissa Useimmin tietokoneohjelmissa kokonaisluku 32- tai 64-bittinen 811120P Diskreetit rakenteet, Lukujen esittäminen 13
2.2.1 Etumerkillisten kokonaislukujen esittäminen 16-bittisiä lukuja 2 16 = 65536 kappaletta -> etumerkillisinä esitetään luvut -32768.. 32767 Positiiviset luvut esitetään siten, että ylin bitti on 0 ja 15 alinta bittiä antaa luvun Negatiivisissa luvuissa ylin bitti on 1 Negatiiviset luvut esitetään ns. kakkosen komplementtina: kun -32768 n < 0, ylin bitti 1 ja 15 alinta (ei-negatiivisen) luvun n+ 2 15 = n+ 32768 binaariesitys 811120P Diskreetit rakenteet, Lukujen esittäminen 14
2.2.1 Etumerkillisten kokonaislukujen esittäminen (2) 811120P Diskreetit rakenteet, Lukujen esittäminen 15
2.2.1.1 Kakkosen komplementin muodostaminen Olkoon x luvun (16-bittinen) binaariesitys. Alkuun lisätään tarvittaessa nollabitit Tapa 1: 1. Haetaan luvun x oikeanpuolimmaisin ykkönen, joka säilyy ykkösenä 2. Em. ykkösen oikeanpuoleiset nollat säilyvät nollina 3. Kohdan 1 ykkösen vasemmanpuoleiset bitit käännetään (nolla ykköseksi ja ykkönen nollaksi) Tapa 2: Käännetään luvun x kaikki bitit (ns. ykkösen komplementti) ja lisätään saatuun lukuun 1 811120P Diskreetit rakenteet, Lukujen esittäminen 16
Tehtäviä Muodosta seuraavien kokonaislukujen 16-bittinen tietokone-esitys. Negatiivisten lukujen tapauksessa etsi kakkosen komplementti kahdella eri tavalla 2987-9800 -23120 Muodosta kokonaisluvun -9800 32-bittinen tietokoneesitys 811120P Diskreetit rakenteet, Lukujen esittäminen 17
2.2.1.2 Kokonaislukuaritmetiikka tietokoneessa Tarkastellaan laskutoimitusta x+y, kun x ja y ovat 16- bittisiä kokonaislukuja {-32768,..., 32767} Ongelma: kahden positiivisen luvun binaarisummassa voi ylin bitti olla 1 -> tulkitaan negatiiviseksi Esim. 16384 10 +16384 10 = 010 0 2 + 010 0 2 = 100 0 2 = -32768 10 Ongelma 2: kahden negatiivisen luvun binaarisummassa syntyy ylivuotobitti -> kun pudotetaan, summa voidaan tulkita positiiviseksi Esim. -32767 10 + (-32767) 10 = 100 01 2 + 100 01 2 = 00 10 2 = 2 10 (kun ylivuotobitti pudotettu) 811120P Diskreetit rakenteet, Lukujen esittäminen 18
2.2.1.2 Kokonaislukuaritmetiikka tietokoneessa (2) Havaitaan: Kun x ja y ovat 16-bittisiä kokonaislukuja {-32768,..., 32767} sekä x+y {-32768,..., 32767}, niin yhteenlasku antaa oikean tuloksen kun ylivuotobitti pudotetaan Tehtävä. Suorita seuraavat 16-bittisten kokonaislukujen laskutoimitukset kuten tietokoneessa: 12000 5200, 2500 5200. Tarkista, onko lopputulos oikea. 811120P Diskreetit rakenteet, Lukujen esittäminen 19
2.2.2 Reaalilukujen esittäminen tietokoneessa Mutkikkaampaa kuin kokonaislukujen esittäminen Tavallinen desimaaliesitys soveltuu huonosti tietokoneessa käytettäväksi Perustuu eksponentiaaliseen merkintään: käytetään muotoa a 10 e, missä a (0,1) ja e on kokonaisluku Esim. 0.1234 10 6 = 123400, 0.234 10-3 = 0.000234 Terminologiaa: luvussa 0.5976 10 25 0.5976 on signifikantti (eli mantissa) 10 on kanta(luku) 25 on eksponentti jos signifikantti välillä [0.1,1), esitys normaalimuodossa 811120P Diskreetit rakenteet, Lukujen esittäminen 20
2.2.2 Reaalilukujen esittäminen tietokoneessa (2) Useimmiten 32- tai 64-bittinen esitys Esitetään useimmiten IEEE:n standardilla 754 Muunnetaan luku normaalimuotoiseen binaariseen eksponettimuotoon Kiinteä määrä bittejä esitykseen Ensimmäinen bitti etumerkkibitti (1 tarkoittaa negatiivista lukua) Seuraavaksi sovittu määrä bittejä määräämään eksponentti Loput bitit signifikantille 32-bittisessä esityksessä 8 bittiä eksponenttia varten ja 23 bittiä signifikantille 811120P Diskreetit rakenteet, Lukujen esittäminen 21
2.2.2 Reaalilukujen esittäminen tietokoneessa (3) Jotta voitaisiin esittää itseisarvoltaan hyvin pieniä lukuja, on sallittava negatiiviset eksponentit -> lukuun tallennetaan karakteristika = eksponentti + eksponenttipoikkeama 32-bittisissä luvuissa eksponenttipoikkeama = 2 7-1 = 127 Esim. Mitä reaalilukua vastaa 32-bittinen esitys 11000010011110100000000000000000? em karakteristika signifikantti Vastaus: -30.5 811120P Diskreetit rakenteet, Lukujen esittäminen 22
2.2.2.1 Reaaliluvun muuntaminen tietokoneesitykseksi Muuta luku binaarimuotoon Signifikanttiin varattujen bittien lukumäärän sallimalla tarkkuudella Esitä binaariluku normeeratussa binaarisessa eksponenttimuodossa Laske karakteristika käyttäen eksponenttipoikkeamaa Kirjoita tietokone-esitys 1. bitti on etumerkkibitti, tämän jälkeen karakteristikan bittijono, viimeisenä signifikantti Tehtävä: Etsi luvun 1250.15625 32-bittinen tietokoneesitys (Vastaus: 01000101010011100010001010000000) 811120P Diskreetit rakenteet, Lukujen esittäminen 23
2.2.2.2 Tietokoneella esitettävien reaalilukujen koko Tarkastellaan 32-bittistä esitystä Karakteristika voi saada arvoja 0:sta lukuun 2 8-1 = 255 -> Koska eksponenttipoikkeama = 127, voi eksponentti saada arvoja -127,,128 Signifikantti vaihtelee luvusta 0.1 2 lukuun 1 2 -> ne positiiviset luvut, joita tietokone voi esittää, tulevat välille [0.1 2 2-127, 1 2 2 128 ) Vastaavasti negatiiviset luvut välille (-1 2 2 128, -0.1 2 2-127 ] 811120P Diskreetit rakenteet, Lukujen esittäminen 24
2.2.2.3 Reaalilukuaritmetiikka tietokoneessa x P(x) x P(x) Reaalilukujen tietokone-esitysten aritmetiikka hankalaa suorittaa käsin Tarkastellaan, miten aritmeettisia operaatioita suoritetaan normalisoidussa eksponenttimuodossa olevilla reaaliluvuilla -> saadaan yleiskuva siitä miten tietokone suorittaa reaalilukuaritmetiikkaa 811120P Diskreetit rakenteet, Lukujen esittäminen 25
2.2.2.3.1 Yhteen- ja vähennyslasku 1. Kirjoitetaan luvut eksponenttimuodossa yhteistä eksponenttia käyttäen siten, että signifikantti on pienempi kuin yksi. 2. Lasketaan signifikantit yhteen; saadaan summan signifikantti; yhteinen eksponentti on vastauksen eksponentti. Vähennyslaskussa lasketaan signifikanttien erotus 3. Normalisoidaan tulos tarvittaessa. 811120P Diskreetit rakenteet, Lukujen esittäminen 26
2.2.2.3.2 Kertolasku 1. Kerrotaan signifikantit; saadaan tulon signifikantti. 2. Lasketaan eksponentit yhteen; saadaan tulon eksponentti. 3. Normalisoidaan vastaus tarvittaessa. 811120P Diskreetit rakenteet, Lukujen esittäminen 27
2.2.2.3.3 Jakolasku 1. Jaetaan signifikantit; saadaan osamäärän signifikantti. 2. Vähennetään jakajan eksponentti jaettavan eksponentista; saadaan tulon osamäärän eksponentti. 3. Normalisoidaan vastaus tarvittaessa. 811120P Diskreetit rakenteet, Lukujen esittäminen 28