Milyen bináris törtnek felel meg ténylegesen egy adott tizedes tört?

Tudjuk, hogy a float típusú tizedes törtek esetében a véges számú biten történő ábrázolás miatt általában nem az egzakt értéket, hanem annak valamilyen pontosságú közelítését kapjuk. Ez a pontosság attól függ, hogy az adott platform a lebegőpontos számokat hány biten tárolja. Egy tizedes tört ténylegesen tárolt értékét megkaphatjuk a float típusú számra meghívott hex() metódussal. Ez egy karakterláncot ad vissza, amely sajátos módon írja le a szám értékét. Ugyanis ebben mind hexadecimálisan, mind decimálisan értelmezendő számok találhatók.

Vegyük például az x = 0.456 tizedes törtet. Az x.hex() hívás eredménye a 0x1.d2f1a9fbe76c9p-2 karaktersor lesz. Ez lényegében egy hatványkitevős alakot ír le, ahol a p betű a bináris alapot, azaz a 2-t jelenti. A p utáni szám a kitevő decimális formában. A 0x a hexadecimális formára utal, és ennek megfelelően a 0x és a p betű közötti rész egy hexadecimális formában ábrázolt törtet jelent, vagyis a mantissza hexadecimális számként van kifejezve.

Ha most arra vagyunk kíváncsiak, hogy az így leírt szám milyen bináris törtnek felel meg, akkor ennek megállapítása a hex() metódus eredményeként kapott karakterlánc alapján nem egy nyilvánvaló, magától értetődő feladat. Ezért e karaktersorozat feldolgozásához és a neki megfelelő bináris tört meghatározásához egy floathex_to_bin nevű függvényt készítünk, amelynek egy lehetséges megvalósítása alább látható. Az egyszerűség kedvéért a konvertálás most csak az egynél kisebb pozitív float számokra végezhető el.

Annak megállapítására, hogy egy bináris törtet jelentő karaktersorozat milyen tizedestörtnek felel meg egy újabb függvényt definiálunk bin_to_dec_fraction néven, amely szintén az előbbi kódban látható. Ebben a Decimal típust használtunk, hogy a számításoknál a float esetleges ábrázolási hibáit kiküszöböljük.

Az előbbi függvényeket a következő tesztsorokban használtuk fel néhány float típusú tört bináris tört formájának meghatározására és azok helyességének ellenőrzésére. A decimális értékek egyezősége alapján láthatjuk, hogy a tizedes törtek ténylegesen ábrázolt értékének megfelelő bináris törtek helyesen állnak elő.

A float típus számábrázolási pontosságáról és vonatkozásairól a Python tudásépítés lépésről lépésre című e-könyvben a „Műveletek” fejezet „Számítási pontosság float típus esetén” című szakaszában, valamint a „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet „Matematikai számítások támogatása” alfejezetben van kiemelten szó. A float típusra értelmezett hex() metódus és annak inverze a fromhex() metódus leírása példákkal a „Beépített típusok nyilvános metódusai” fejezetben található.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.