Denormalizált számok ( eng. denormalized numbers ) vagy szubnormális számok [1] ( eng. subnormal numbers ) – a lebegőpontos számok egy típusa , amelyet az IEEE 754 szabvány definiál .
A számok kódolva vannak : a mantissza 0-tól kezdődik, nem 1-től (nincs implicit ), és a sorrend a lehető legkisebb. A denormált számok közelebb vannak a 0-hoz, mint a legkisebb reprezentálható normalizált szám. A gép 0 is denormalizált szám.
Lebegőpontos (egyszeres pontosságú) , dupla (kettős precíziós) formátumú írás esetén a rendelési mezőbe 0 kerül.
A 10 bájtos dupla (kiterjesztett pontosság) speciális osztályként nem tartalmaz denormalizált számokat, mivel explicit egész részbittel rendelkezik. A legkisebb sorrendű számok (a 0-s sorrend mezőjében) és a 0 egész rész bitje azonban hasonló tulajdonságokkal rendelkeznek.
A memória megtakarítására az úgynevezett implicit mértékegységet használjuk : a bináris szabványos számokat 1,mmm 2 ·2 k -ként írjuk fel , és a fejegységet nem őrzik meg. Ebben a formátumban lehetetlen nullát írni - ezért a gép nullája szükségszerűen valamilyen speciális szám lesz. A kényelem érdekében minimális rendelési mennyiségnek kell lennie.
Az a tény, hogy ezek a speciális számok nem csak nullák, hanem 0,mmm 2 −126 (egy 4 bájtos floatban ), további előnyt jelent: az összeadás és a kivonás nem vezet túlcsorduláshoz (az eredmény nullázásához), ha a művelet eredménye. nem pontos 0 Más szóval, a denormalizált számok bevezetésének köszönhetően a és feltételek ekvivalensek, függetlenül attól, hogy milyen közeli (a mantisszában) és kicsi ( sorrendben ) számokat vonunk ki. Denormalizált számok bevezetése nélkül egy ilyen művelet eredménye 0 lehet, még akkor is, ha a számok nem egyenlőek. Ugyanez vonatkozik az abszolút értékben közel álló, de eltérő előjelű számok összeadására is. Ez nem kívánatos lehet, például osztás nullával hibát okoz, ha az eredményt osztóként használjuk [2] .
Ezzel szemben az MK-61 számológépen 1,8 10 -99 - 1,2 10 -99 kivonása nullát ad, bár a számok nem egyenlőek.
Néhány[ mi? ] processzorok és matematikai társprocesszorok denormált számokkal dolgoznak a hardverben ugyanolyan sebességgel, mint a normalizáltakkal. Más esetekben az ilyen hardveres feldolgozást nem hajtják végre (például az FPU megvalósításának bonyolításának elkerülése érdekében), és a kis értékeket azonnal nullára állítják (lásd a túlcsordulás elleni védelem ), vagy feldolgozzák az operációs rendszerben. szoftverben. A második lehetőség a denormalizált számok feldolgozási idejének növekedéséhez vezet.
A denormalizált számokat az Intel 8087 matematikai társprocesszorban valósították meg abban az időben, amikor az IEEE 754 szabvány írása folyamatban volt. Ezek voltak a javasolt alkalmazás legvitatottabb jellemzői, amelyeket végül elfogadtak [3] , de ez a megvalósítás bebizonyította, hogy a denormalizált számok hardveresen kezelhetők a gyakorlatban. A lebegőpontos modulok egyes megvalósításai nem támogatják a denormált számokat hardverben, hanem szoftveresen dolgozzák fel azokat. Bár ez a feldolgozás átlátható a felhasználó számára, előfordulhat, hogy a denormált számokat generáló vagy bemenetként fogadó számítások sokkal tovább tartanak, mint a normalizált számokkal végzett azonos számítások.
Példa egy olyan rendszerre, ahol a számábrázolási formátum nem tartalmazott denormált számokat, a ZX Spectrum .
A denormalizált számok bevezetésének oka egy általánosabb számítási probléma része, amely a számok összegének korlátozott pontossággal történő meghatározását jelenti (lásd például Kahan algoritmusát ). Ráadásul a denormált számok bevezetésével megoldott probléma viszonylag szűk számtartományban – az alulcsordulási határ közelében – jelentkezik . De hasonló probléma társulhat a túlcsorduláshoz is: ha például két különböző előjelű számot akarunk összehasonlítani, amelyek sorrendje maximum, akkor a feltétel sikeresen tesztelve negatív eredményt ad, és a feltétel vezethet túlcsordulási hibára. Így általános esetben a denormalizált számok nem oldják meg a tagok permutációjától függő eredmény problémáját, és a lebegő aritmetikával való munkavégzés során a programozótól továbbra is bizonyos pontosság szükséges. Abban az esetben, ha a programozónak az alulcsordulás határán lévő számokkal kell dolgoznia , helyénvalóbbnak tűnik olyan formátumra váltani, amely szélesebb kitevő -tartományt tartalmaz , vagy speciális intézkedéseket alkalmaz a kitevő nagyságának szabályozására , mint a denormált számokra hagyatkozni. Ezenkívül emlékeznie kell arra, hogy a denormalizált számokban a mantissza kevesebb jelentős számjegye van, mint az ennél a formátumnál szokásos számjegyek, és ez jelentős pontosságvesztéssel jár.