Mi az mi? · bei.pm
Ebbe a rovatba cikkek találhatók a fájlformátumokról és a fordított mérnökségről.
Most azonban a helyzet a következő:
Sok programozási nyelv létezik odakint, és sok ember ismer olyan dolgokat teljesen más neveken - vagy éppen hogy fogalma sincs a legalapvetőbb dolgok létezéséről, mert a programozási nyelve elvonatkoztat tőlük.
tl;dr:
A notációm nagyjából a C99 <stdint.h>
alapján készült. Aki ért ehhez a notációhoz, az biztosan boldogulni fog a sajátommal is.
Egész szám
Egész számok egyszerűen fogalmazva, olyan számok, amelyeknek nincs tizedes része.
Egész számok általában egy meghatározott számérték tartományban, kvázi egy felbontás keretein belül vannak definiálva. Ezt bitben adom meg - azért, mert egy "Byte" és az arra épülő típusok (Word, Qword, ...) általában platformfüggőek.
Továbbá az egész szám típusok között megkülönböztetünk természetes számokat (ℕ, azaz, előjel nélküli - Unsigned) és egész számokat (ℤ, azaz, előjeles - Signed).
Ez az információ egy előjellel a megnevezésben (u
vagy s
) látható.
Lehetséges, hogy előjeles egész számokat vagy egyes komplementum formájában, vagy kettes komplementum formájában ábrázolják.
Ha másként nincs megadva, akkor a kettes komplementum használatos, mivel a modern informatikában ez a preferált ábrázolás.
Az előjel nélküli számokat az én dokumentációimban uint
formájában adom meg, a pontosság további megadásával bit egységben.
Az előjeles számokat az én dokumentációimban sint
formájában adom meg, szintén a pontosság további megadásával bit egységben.
Elhagyom a "char" adattípus használatát a karakterekhez, mivel a karakterláncok általában csak egész számokból álló láncokat jelentenek, speciális értelmezéssel.
Ezeket ezért uint(8)[]
formában ábrázolom.
Példák:
Jelölés | C99 stdint.h -egyenérték |
Leírás | Számhatár |
---|---|---|---|
uint(16) | uint16_t | Előjel nélküli egész szám, 16 bit hosszúság | 0 - 65.535 |
sint(8) | int8_t | Előjeles egész szám, 8 bit hosszúság, kettős komplement | -126 - 127 |
uint(24) | uint32_t:24 | Előjel nélküli egész szám, 24 bit hosszúság | 0 - 16.777.216 |
Összesített értékek
Rögzített tizedes értékek a racionális számok (Q) spektrumából származó számértékek, amelyek tehát rendelkeznek egy tizedessel és tizedes helyekkel.
Rögzített tizedes értékek esetén - ezért is a neve - a tizedes helyzete a típus által rögzítve van.
Ebből következik egy meghatározott számkészlet ezen adattípus számára; matematikailag kifejezve a számkör véges.
A valóságban ezt az adattípust főként olyan platformokon használják, ahol nincs elegendően gyors lebegőpontos hardveregység, mivel a rögzített tizedes értékek kiszámítása egész szám egységekkel történhet.
Ez az adattípus például adatbázis-kezelő rendszerekben is használatos, amikor rögzített követelmények teljesítése szükséges.
Itt gondoljunk például a pénzügyi adatok tartós tárolására; a legtöbb valuta 2 tizedes helyre korlátozódik.
(De nem okos ezt rögzített tizedes értékekkel tenni; bölcsebb közvetlenül a legkisebb valutaegységet egész számként tárolni és a fennmaradó megjelenítési szintet átadni)
Hasonlóan az egész számok esetében, a rögzített tizedes értékeknél is megadom a szám felbontását előtte és utána a tizedesnek:
ufixed(9,7)
egy olyan adattípust jelöl, amely előjel nélküli 9 bitet foglal el a tizedes előtti érték számára, valamint 7 bitet a tizedes utáni értékhez; összesen tehát 16 bit széles, így például két független egész szám vektoraként a (0,0) és (511,127) közötti tartományt lefedheti.
Ez az értelmezés azonban a tizedes ábrázolásában 28 számot haszontalanul veszteget el, mivel a gyakorlatban valószínűleg inkább a maximálisan (511,99) értékre korlátozódna.
A rögzített tizedes értékek közvetlen értelmezése helyett, mint egy vektor 2 különálló egész számként - ami szinte mindig haszontalan adatmezőt jelent a tizedes számokká való átalakítás során és kézi átvitel szükségességét vonja maga után - a tizedes rész a teljes felbontásuk tört alakjaként is értelmezhető.
A fent említett ufixed(9,7)
példájaként így egy 27 nagyságú nevezőn kifejezett tört jön létre - a számkör ezután 0,00-tól 511 + 126⁄127 terjed.
A tizedes ábrázolásba való átalakításhoz tehát a tizedes helyet 128-cal kell osztani.
Ezzel a verzióval egyszerűbb számítási műveleteket végezni, mivel az átvitel automatikusan adódik, ezért ezt a verziót általában előnyben részesítik.
Ennek a verziónak azonban az a hátránya, hogy a tizedes helyek a tizedes ábrázolásban már nem rendelkeznek garantált felbontással, így egyetlen tizedes hely már nem az 0.01
, hanem a 0.007874
értéket képviseli, ami megfelelő kerekítési hibákhoz vezet.
A használt értelmezési módot a felhasználás helyén dokumentálják.
Lebegőpontos értékek
Lebegőpontos értékek matematikailag összetettebb kifejezések, ahol egy egész szám rögzített felbontással egy matematikai kifejezésen keresztül úgy van kifejezve, hogy a tizedes rész lényegében eltolással alakul ki - és ezáltal közvetlenül kapcsolódik a tudományos notációhoz.
A legelterjedtebb módja ennek megvalósításának az
IEEE 754 szabványosítása, amely azóta nemzetközileg elismert.
Egy lebegőpontos érték jellemzően a következő komponensekből áll:
Előjel (0 vagy 1 ) |
Exponens | Mantissza |
Míg az előjel bináris igen/nem információként egyszerűen kinyerhető, a tényleges szám a következő egyenlet alapján képződik
Mantissza * 2Exponens
Továbbá van egy sor konstans érték, amelyek különleges eseteket racionális számok fednek le - köztük ±∞
és NaN
("érvénytelen szám").
A lebegőpontos értékek különösen hasznosak, amikor az pontoság nem annyira fontos, mivel ezen értékek esetében elkerülhetetlenek a kerekítési hibák, így a pontosságvesztés is. Tipikusan a lebegőpontos értékeket például koordináták meghatározására használják, mint például a csúcsvektorok 3D modellekben vagy Bézier-/Spline-görbék optikai ábrázolási célokra.
A formátumokban a lebegőpontos értékeket float(Mantissza, Exponens)
formátumban jelölik.
Ha az IEEE 754-től eltérő formátumot használnak, azt megfelelően jelzik.