logo

Rozsah plaváka v pytóne

V Pythone, rozsah plaváka hodnoty závisia od implementácie a platformy. Špecifikácia jazyka Python to vyžaduje s pohyblivou rádovou čiarkou čísla podporujú minimálne 1e-308 do 1e+308 s presnosťou minimálne 53 bitov .

V praxi väčšina moderných implementácií Pythonu používa IEEE 754 štandard s pohyblivou rádovou čiarkou, ktorý poskytuje rozsah približne 1,7e-308 do 1,7e+308 s presnosťou 53 bitov . Tento rozsah je rovnaký na všetkých platformách a je podporovaný plavákovým vstavaným typom.

Je však dôležité poznamenať, že aritmetika s pohyblivou rádovou čiarkou je vystavená chybám zaokrúhľovania a iným zdrojom nepresnosti, najmä pri vykonávaní operácií s veľmi veľkými alebo veľmi malými číslami. V niektorých prípadoch to môže viesť k neočakávanému správaniu a chybám.

Aby sa predišlo týmto problémom, často sa odporúča používať desiatkový alebo pevný bod aritmetika pri práci s peňažnými hodnotami alebo inými aplikáciami, ktoré vyžadujú vysokú presnosť. The desiatkový modul v Pythone poskytuje podporu pre aritmetiku s pevnou rádovou čiarkou s konfigurovateľnou presnosťou a je dobrou alternatívou k aritmetike s pohyblivou rádovou čiarkou pre tieto aplikácie.

príklady automatov dfa

The IEEE 754 štandard definuje rozsah a presnosť čísel s pohyblivou rádovou čiarkou, ktoré používa väčšina moderných programovacích jazykov vrátane Pythonu. Norma definuje dva základné formáty pre čísla s pohyblivou rádovou čiarkou:

    Formát s jednou presnosťou

Používa sa 32 bitov a poskytuje približne 7 desatinných miest číslice presnosti.

    Formát s dvojnásobnou presnosťou

Používa sa 64 bitov a poskytuje približne 16 desatinných miest číslice presnosti.

Používa Python dvojitá presnosť čísla s pohyblivou rádovou čiarkou štandardne, čo znamená, že rozsah hodnôt s pohyblivou rádovou čiarkou je približne 1,7e-308 do 1,7e+308 s presnosťou 53 bitov . Tento rozsah je určený maximálnymi a minimálnymi exponentmi, ktoré je možné reprezentovať pomocou 11 bitov v kombinácii s maximálnymi a minimálnymi significands (t. j. zlomkovou časťou čísla), ktoré možno reprezentovať pomocou 52 bitov .

Skutočná presnosť aritmetiky s pohyblivou rádovou čiarkou môže byť ovplyvnená mnohými faktormi, vrátane spôsobu, akým sú čísla uložené v pamäti, poradia operácií a výberu režimu zaokrúhľovania. V niektorých prípadoch to môže viesť k jemným chybám zaokrúhľovania a iným zdrojom nepresnosti.

Aby sa predišlo týmto problémom, často sa odporúča použiť alternatívne prístupy pri práci s veľmi veľkými alebo veľmi malými číslami, alebo keď sa vyžaduje vysoká presnosť. Napríklad:

  1. Použite aritmetika s pevným bodom alebo desiatková aritmetika , ktorý poskytuje presný počet desatinných miest a zabraňuje chybám pri zaokrúhľovaní.
  2. Použite ľubovoľná-presnosť knižnice ako 'mpmath' alebo 'gmpy2' , ktoré umožňujú vykonávať výpočty s veľmi vysokou presnosťou a vyhnúť sa chybám pri zaokrúhľovaní.

Jedným dôležitým aspektom, ktorý treba poznamenať, je, že pri vykonávaní aritmetických operácií s číslami s pohyblivou rádovou čiarkou v Pythone sa môžete stretnúť s nejakým neočakávaným správaním v dôsledku spôsobu, akým aritmetika s pohyblivou rádovou čiarkou funguje.

Niektoré aritmetické operácie môžu viesť k veľmi malým alebo veľmi veľkým číslam, ktoré nemožno presne znázorniť pomocou aritmetiky s pohyblivou rádovou čiarkou. V týchto prípadoch môže byť výsledok zaoblené alebo skrátený , čo vedie k neočakávanému správaniu alebo nepresnostiam vo vašich výpočtoch.

Aritmetika s pohyblivou rádovou čiarkou nie je asociatívne , čo znamená, že poradie, v ktorom vykonávate operácie, môže ovplyvniť výsledok. Napríklad, (a + b) + c sa nemusí rovnať a + (b + c) v dôsledku chýb zaokrúhľovania a iných zdrojov nepresnosti.

Aritmetika s pohyblivou rádovou čiarkou tiež nie je distributívny , čo znamená, že (a + b) * c sa nemusí rovnať a * c + b * c v dôsledku chýb zaokrúhľovania a iných zdrojov nepresnosti. Aby sa minimalizoval vplyv týchto problémov, často sa odporúča použiť matematický modul alebo iné numerické knižnice, ktoré poskytujú funkcie na vykonávanie aritmetických operácií s číslami s pohyblivou rádovou čiarkou presnejším a spoľahlivejším spôsobom. Je tiež dobrým zvykom vyhnúť sa porovnávaniu čísel s pohyblivou rádovou čiarkou pre rovnosť a namiesto toho použiť prah tolerancie alebo iné metódy na porovnanie veľkosti rozdielu medzi dvoma hodnotami.

Príklad:

Uveďme si príklad, ako na to aritmetika s pohyblivou rádovou čiarkou môže viesť k neočakávanému správaniu v pythone:

 a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2) 

Výkon:

 0.6000000000000001 0.6 

Vysvetlenie:

V tomto príklade vykonávame dva rôzne výpočty s použitím rovnakých hodnôt a, b, a c . V prvom výpočte pridáme a a b najprv a potom pridajte výsledok do c . V druhom výpočte pridávame b a c najprv a potom pridajte výsledok do a .

Mohli by sme očakávať, že tieto dva výpočty prinesú rovnaký výsledok, pretože používajú rovnaké hodnoty a, b , a c . V dôsledku obmedzení aritmetiky s pohyblivou rádovou čiarkou však tieto dva výpočty poskytujú mierne odlišné výsledky.

Prvým výpočtom sa získa výsledok 0,6000000000000001 , zatiaľ čo druhý výpočet produkuje výsledok 0,6 . Je to preto, že medzivýsledky prvého výpočtu sa mierne líšia od medzivýsledkov druhého výpočtu v dôsledku chýb zaokrúhľovania a iných zdrojov nepresnosti.

Aby ste sa vyhli týmto problémom, často sa odporúča použiť desiatkový modul alebo iné spôsoby vykonávania aritmetické operácie na s pohyblivou rádovou čiarkou čísla presnejším a spoľahlivejším spôsobom.

Napríklad:

 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) 

Výkon:

 0.6 0.6 

Vysvetlenie:

V tomto príklade používame desiatkový modul na vykonanie rovnakých výpočtov pomocou pevný bod aritmetika s presnosťou na 1 desatinné miesto. Umožňuje nám vyhnúť sa zaokrúhľovacím chybám a iným zdrojom nepresnosti, ktoré môžu ovplyvniť s pohyblivou rádovou čiarkou aritmetika. Výsledkom je, že oba výpočty dávajú rovnaký výsledok 0,6 .