[[oktatas:számítástechnika|< Számítástechnika]] ====== Számábrázolás ====== * **Szerző:** Sallai András * Copyright (c) 2012, Sallai András * Szerkesztve: 2012, 2014, 2015, 2017, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Osztályozás ===== A számítógépeken a számokat fixpontos vagy lebegőpontos alakban ábrázoljuk. Volt kísérlet a decimális ábrázolásra is, az végül nem terjed el. * Fixpontos * előjel nélkül * előjeles * abszolút értékes * kettes komplemens * eltolásos (többletes) * Lebegőpontos * Decimális ===== Fixpontos számábrázolás ===== ==== Előjel nélkül ==== Pl.: 6-ot nyolc helyen ábrázolva: 00000110 Ha nem fér el a szám nyolc helyen túlcsordulás történik. A számok csak nulla vagy pozitívak lehetnek. ==== Előjeles ábrázolás ==== Negatív számok is lehetnek === Abszolút értékes === Az első bit mindig az előjel. Rendszerint ha a szám negatív az első bit 1-es. Ha null vagy pozitív szám akkor az első bit 0. Pl. -6 ábrázolása: 10000110 === Kettes komplemens === Veszem a szám kettes komplemensét, így ábrázolom. Pl. -6 11111010 === Eltolásos === 2n-1hozzáadok minden számhoz. Az n mutatja meg, hány helyen ábrázolom a számot. Pl. 8 helyen ábrázolom a 6-ot: n = 8 2n-1 akkor 27 = 128 (-6) + 128 = 122 122 binárisan 01111010 ===== Lebegőpontos számábrázolás ===== ==== Egyszerűen ==== A számot a következő alakban írjuk fel: m * a^k Tulajdonképpen a számot hatványkitevős alakban írjuk fel. Röviden ennyi. De nézzük részletesen. Az "m" a mantissza szóból. Az "a" az alap szóból. A "k" kitevő szóból. A kitevő helyett szoktak még exponenst is használni. Angol nyelven a mantissza: mantissa, de szinonimák a significand és a coefficient. ==== Részletesen ==== Matematika óráról tudjuk, hogy 1,0000 * 10 = 10,000 Vagyis egyszer tíz az tíz. A szorzás eredménye olyan mintha a bal oldalon álló számnál a tizedesvesszőt egyel jobbra mozdítottam volna. Ugyanígy: 1,0000 * 100 = 100,00 Olyan mintha a szorzás bal oldalán lévő számnál a tizedesvesszőt kettővel jobbra mozdítottam volna. 1,0000 * 1000 = 1000,0 Tehát 10 vagy annak valamelyik hatványával való szorzás műveletét elvégezhetjük a tizedes vessző elmozdításával is. Most vegyük az utolsó műveletsort. Egyszer ezer az ezer. Ezer felírható tíz és száz szorzataként is: 10,000 * 100 = 1000,0 A szorzás jel baloldalán mindössze a tizedes vessző jobbra kellett mozgatni. De felírható így is: 100,00 * 10 = 1000,0 A tizedesvesszőt még egyel jobbra mozgattuk. A következő is ugyanaz: 1000,0 * 1 = 1000,0 Vegyük észre, hogy a szorzás jel jobboldalán tíz hatványait jelenítjük meg: * 1, 10, 100, stb. mivel: * 10^0=1 * 10^1=10 * 10^2=100 * 10^3=1000 * stb. Ezek szerint egy számot le tudok írni egy tizedestört és tíz valamelyik hatványával többféleképpen is. Vegyük a következő számot most megismert felírási módban: 3,4 * 10^{1} A fenti szám szimplán leírva: 34,0 De ugyanezt jelentik a következő alakok is: * 340,0 * 10^-1 * 34,0 * 10^0 * 0,340 * 10^2 * 0,0340 * 10^3 Láthatjuk, hogy a vessző ide-oda mozoghat, ha változtatjuk a hatványt. Úgy is mondhatnánk a vessző ide-oda lebeg. Angolszász nyelvterületen a tizedesvessző helyett tizedes pontot használunk. Innen ered a számábrázolás neve: Lebegőpontos számábrázolás. Az eredeti alakban: 34,0, a tizedesvesszőt nem tehetjük arrébb, mert akkor megváltozik a szám értéke. A tizedesvessző helye mindig fix. Ezért ezt fixpontos számábrázolásnak nevezzük. ==== A lebegőpontos számok pontossága ==== Ha valós számokkal dolgozunk a pontosság nem probléma, mivel mondhatjuk végtelen. A számítógépeken a memória viszont véges, így el kell döntenünk mekkora pontossággal dolgozunk. A lebegőpontos számábrázolással kapcsolatos pontosság fogalmát az Intel vezette be. Az Intel ehhez felfogadta William Morton Kahan matematikust a lebegőpontos formátum bináris ábrázolásának kidolgozásához. Háromféle lebegőpontos formátumot vezetett be: * egyszeres - C nyelv float * kétszeres - C nyelv double * kiterjesztett === Egyszeres pontosság === 32 bites {{:oktatas:számítástechnika:egyszerespontossag.png|}} === Dupla pontosság === 64 bites {{:oktatas:számítástechnika:duplapontossag.png|}} === Kiterjesztett pontosság === {{:oktatas:számítástechnika:kiterjesztettpontossag.png|}} ===== Tudományos alak ===== A tudományos alak másik neve: **exponenciális forma**. A fenti példákból láthatjuk, hogy a szorzás jobb oldalán a hatványozás alapja állandóan tíz, mivel tízes számrendszerben számolunk. Vegyük újra az egyik példát, ábrázoljuk a tízet egy nagy "E" betűvel, de lehet akár kis "e" betű is. Az eredeti szám: 0,340 * 10^2 A szorzásjelet kötelező kitenni, mert nélküle egybeolvad mantissza és a számrendszer alapja. A karakterisztikát felső indexbe kell írni, ahogy a hatványozásnál ezt szoktuk. Ha egy kijelzőn nincs lehetőség a felső index ábrázolására, akkor gond van a megjelenítéssel. A tíz cseréje egy "E" betűre: 0,340 * E^2 Ekkor elhagyható a szorzás jel és a 2-es felső indexben ábrázolása: 0,340E2 Ekkor megkaptuk a szám tudományos alakját. A tudományos alak esetén, jelölhetjük a kitevő előjelét például: 0,340E + 2 Természetesen negatív kitevő esetén ez kötelező. ===== Normalizált alak ===== Egyes könyvekben "normált" alak. Láttuk fentebb, hogy lebegőpontos számábrázolással ugyanazt a számot (34) leírhatjuk több alakban is: * 0340,0 * 10^-1 * 034,0 * 10^0 * 0,340 * 10^2 * 0,0340 * 10^3 Ha tizedesvessző helyét úgy állítjuk be, hogy mantissza egész része 0 és 1 közötti szám lesz, akkor normalizált alakról beszélünk. Az előbbi szám esetén ez: * 0,340 * 10^2 ===== Decimális számábrázolás ===== A számot számjegyenként kódolom. * BCD kódolás * zónázott * pakolt ==== BCD kódolás ==== A BCD kódolás esetén a számokat számjegyenként kódoljuk. ==== Zónázott kódolás ==== A számokat számjegyenként külön bájtban tároljuk. A bájt alsó részében tároljuk a számot, a felső részében csupa egyesekkel töltjük fel. Hexadecimálisan ez egy F. A F-et zónajelnek is nevezzük. ==== Pakolt kódolás ==== Hasonló a zónázott kódoláshoz, de a számjegyek kódolását félbájtonként végezzük. ===== Komplemens képzés ===== A komplemensek képzését bináris számokon értelmezzük. Legyen a példa kedvéért az ötös szám binárisan: 0101 Ennek egyes komplemense, az ellentétje: 00000101 00001010 Az egyes komplemense: 11111010 A kettes komplemenst úgy képezzük, hogy 1-et adunk az előző eredményhez. Adjunk 11111010-hoz 1-t: 11111010 +00000001 _________ 11111011 Öt kettes komplemense tehát: 11111011. Hol használjuk ezt? A negatív számok ábrázolásánál ezt a formát használjuk. Tehát -5 ábrázoláshoz annak kettes komplemensét használom. Miért jó ez nekem? Az összeadás könnyebb, ha a negatív számok kettes komplemensben vannak felírva. Lássunk egy összeadást. Adjuk +5-höz. -1-et. A mínusz egy: 00000001 A mínusz egy egyes komplemense: 11111110 A mínusz egy kettes komplemense: 11111111 A mínusz egy és az öt összeadása: 11111111 +00000101 _________ 100000100 Az eredményben a baloldali 1-s eltűnik túlcsordulás miatt így marad: 00000100 Ez pedig pontosan négyet jelent. Az eredmény jó, és egyszerű volt az összeadás. ===== Előjelbit ===== A számítógépek a számábrázolás során a negatív számokat néha egy előjel bittel jelzik. Ha van egy egy bájt méretű tárolóm, akkor abban 8 bitem van. A biteket jobbról balra számoljuk. ^ sorszám | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ^ tároló | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | A nyolcadik bitet használhatjuk az előjel jelzésére. Azt mondjuk, ha nyolcadik bit 1 akkor negatív számról van szó, a nulla akkor pozitív. A legnagyobb ábrázolható szám így persze csak 7 bites. A fenti tárolóban tehát +5 van. A következő szám egy negatív számot mutat: ^ sorszám | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | ^ tároló | 1 | 1 | 1 | 1 | 1 | 0 |1 | 1 | Mivel a nyolcadik bit 1 értékkel szerepel, tudjuk, hogy negatív számról van szó. Veszem a számot: 1111011 Kivonok belőle 1-t: 1111010 Veszem az ellentétét: 0000101 És megkaptam a számot. Ez 5, de mivel be volt állítva az előjelbit, tudjuk, hogy -5. ===== Irodalom ===== * http://www.inf.unideb.hu/~jvegh/public/edu/ASM386/AoAHLA/html/ch04s02.html (2014)