A Pythonban a az úszó tartománya értékek a megvalósítástól és a platformtól függenek. A Python nyelvi specifikáció csak ezt követeli meg lebegőpont a számok legalább támogatják 1e-308 nak nek 1e+308 legalábbis pontossággal 53 bites .
A gyakorlatban a legtöbb modern Python implementáció a IEEE 754 lebegőpontos szabvány, amely kb 1.7e-308 nak nek 1,7e+308 pontossággal 53 bites . Ez a tartomány minden platformon azonos, és az úszó beépített típus támogatja.
Fontos azonban megjegyezni, hogy a lebegőpontos aritmetika ki van téve kerekítési hibáknak és egyéb pontatlansági forrásoknak, különösen akkor, ha nagyon nagy vagy nagyon kis számokkal végez műveleteket. Ez bizonyos esetekben váratlan viselkedéshez és hibákhoz vezethet.
E problémák elkerülése érdekében gyakran javasolt a használata decimális vagy fix pont aritmetika, ha pénzbeli értékekkel vagy más nagy pontosságot igénylő alkalmazásokkal dolgozik. A decimális modul a Pythonban konfigurálható pontossággal támogatja a fixpontos aritmetikát, és jó alternatívát jelent ezekben az alkalmazásokban a lebegőpontos aritmetika helyett.
mysql felhasználói lista
A IEEE 754 szabvány határozza meg a legtöbb modern programozási nyelv, köztük a Python által használt lebegőpontos számok tartományát és pontosságát. A szabvány két alapvető formátumot határoz meg a lebegőpontos számokhoz:
Használja 32 bites és kb 7 tizedes a pontosság számjegyei.
Használja 64 bites és kb 16 tizedes a pontosság számjegyei.
Python használ dupla pontosság alapértelmezés szerint lebegőpontos számok, ami azt jelenti, hogy a lebegőpontos értékek tartománya megközelítőleg 1.7e-308 nak nek 1,7e+308 pontossággal 53 bites . Ezt a tartományt az ábrázolható maximális és minimális kitevő határozza meg 11 bites , kombinálva a maximális és minimális szignifikansokkal (azaz a szám tört részével), amelyek segítségével ábrázolható 52 bites .
A lebegőpontos aritmetika tényleges pontosságát számos tényező befolyásolhatja, többek között a számok memóriában való tárolásának módja, a műveletek sorrendje és a kerekítési mód kiválasztása. Ez bizonyos esetekben finom kerekítési hibákhoz és egyéb pontatlanságokhoz vezethet.
E problémák elkerülése érdekében gyakran ajánlatos alternatív módszereket alkalmazni, ha nagyon nagy vagy nagyon kis számokkal dolgozik, vagy ha nagy pontosságra van szükség. Például:
- Használat fixpontos aritmetika vagy decimális aritmetika , amely fix számú tizedesjegy pontosságot biztosít, és elkerüli a kerekítési hibákat.
- Használat tetszőleges pontosság könyvtárak, mint 'mpmath' vagy 'gmpy2' , amelyek lehetővé teszik a számítások nagyon nagy pontosságú elvégzését és a kerekítési hibák elkerülését.
Fontos megjegyezni, hogy amikor lebegőpontos számokkal aritmetikai műveleteket hajt végre Pythonban, a lebegőpontos aritmetika működése miatt váratlan viselkedéssel találkozhat.
Egyes aritmetikai műveletek nagyon kicsi vagy nagyon nagy számokat eredményezhetnek, amelyeket nem lehet pontosan lebegőpontos aritmetikával ábrázolni. Ezekben az esetekben az eredmény lehet lekerekített vagy megcsonkított , ami váratlan viselkedéshez vagy pontatlanságokhoz vezet a számításokban.
Lebegőpontos aritmetika nem asszociációs , ami azt jelenti, hogy a műveletek végrehajtásának sorrendje befolyásolhatja az eredményt. Például, (a + b) + c lehet, hogy nem egyenlő a + (b + c) kerekítési hibák és egyéb pontatlansági források miatt.
A lebegőpontos aritmetika szintén nem elosztó , ami azt jelenti (a + b) * c lehet, hogy nem egyenlő a * c + b * c kerekítési hibák és egyéb pontatlansági források miatt. E problémák hatásának minimalizálása érdekében gyakran ajánlott a matematikai modul vagy más numerikus könyvtárak használata, amelyek függvényeket biztosítanak a lebegőpontos számokkal végzett aritmetikai műveletek pontosabb és megbízhatóbb végrehajtásához. Az is jó gyakorlat, hogy elkerüljük a lebegőpontos számok összehasonlítását az egyenlőség érdekében, és ehelyett tűrésküszöböt vagy más módszereket használunk a két érték közötti különbség nagyságának összehasonlítására.
Példa:
Vegyünk egy példát annak bemutatására, hogyan lebegőpontos aritmetika váratlan viselkedéshez vezethet a pythonban:
a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
Kimenet:
0.6000000000000001 0.6
Magyarázat:
Ebben a példában két különböző számítást hajtunk végre, ugyanazokkal az értékekkel a, b, és c . Az első számításnál hozzátesszük a és b először, majd add hozzá az eredményt ehhez c . A második számításnál hozzáadjuk b és c először, majd add hozzá az eredményt ehhez a .
Elvárhatjuk, hogy a két számítás ugyanazt az eredményt adja, mivel ugyanazokat az értékeket használják a, b , és c . A lebegőpontos aritmetika korlátai miatt azonban a két számítás némileg eltérő eredményt ad.
Az első számítás eredményt ad 0,60000000000000001 , míg a második számítás eredménye a 0.6 . Ennek az az oka, hogy az első számítás közbenső eredményei kerekítési hibák és egyéb pontatlanság miatt kissé eltérnek a második számítás közbenső eredményeitől.
E problémák elkerülése érdekében gyakran ajánlott a decimális modul vagy egyéb végrehajtási módszerek aritmetikai műveletek tovább lebegőpont pontosabb és megbízhatóbb számokat.
Például:
import decimal a = decimal.Decimal('0.1') b = decimal.Decimal('0.2') c = decimal.Decimal('0.3') result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
Kimenet:
0.6 0.6
Magyarázat:
Ebben a példában a decimális modul segítségével végezze el ugyanazokat a számításokat fix pont aritmetika pontossággal 1 tizedesjegy. Lehetővé teszi számunkra, hogy elkerüljük a kerekítési hibákat és a pontatlanság egyéb forrásait, amelyek befolyásolhatják lebegőpont számtan. Ennek eredményeként mindkét számítás ugyanazt az eredményt adja 0.6 .