[[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)