V Pythonu je dosah plováku hodnoty závisí na implementaci a platformě. Specifikace jazyka Python to pouze vyžaduje plovoucí bod čísla podporují minimálně 1e-308 na 1e+308 s přesností minimálně 53 bitů .
V praxi většina moderních implementací Pythonu používá IEEE 754 standard s plovoucí desetinnou čárkou, který poskytuje rozsah přibližně 1,7e-308 na 1,7e+308 s přesností 53 bitů . Tento rozsah je stejný na všech platformách a je podporován plovoucím vestavěným typem.
Je však důležité poznamenat, že aritmetika s plovoucí desetinnou čárkou podléhá zaokrouhlovacím chybám a dalším zdrojům nepřesnosti, zejména při provádění operací s velmi velkými nebo velmi malými čísly. V některých případech to může vést k neočekávanému chování a chybám.
Aby se předešlo těmto problémům, často se doporučuje používat desetinný nebo pevný bod aritmetika při práci s peněžními hodnotami nebo jinými aplikacemi, které vyžadují vysokou přesnost. The desítkový modul v Pythonu poskytuje podporu pro aritmetiku s pevnou řádovou čárkou s konfigurovatelnou přesností a je pro tyto aplikace dobrou alternativou k aritmetice s pohyblivou řádovou čárkou.
java booleovský řetězec
The IEEE 754 standard definuje rozsah a přesnost čísel s plovoucí desetinnou čárkou používaných většinou moderních programovacích jazyků, včetně Pythonu. Norma definuje dva základní formáty pro čísla s plovoucí desetinnou čárkou:
Používá 32 bitů a poskytuje přibližně 7 desetinných míst číslice přesnosti.
Používá 64 bitů a poskytuje přibližně 16 desetinných míst číslice přesnosti.
Používá Python dvojitá přesnost čísla s plovoucí desetinnou čárkou ve výchozím nastavení, což znamená, že rozsah plovoucích hodnot je přibližně 1,7e-308 na 1,7e+308 s přesností 53 bitů . Tento rozsah je určen maximálními a minimálními exponenty, které lze pomocí reprezentovat 11 bitů v kombinaci s maximálními a minimálními significands (tj. zlomkovou částí čísla), které lze reprezentovat pomocí 52 bitů .
Skutečná přesnost aritmetiky s plovoucí desetinnou čárkou může být ovlivněna mnoha faktory, včetně způsobu uložení čísel v paměti, pořadí operací a volby režimu zaokrouhlování. V některých případech může vést k jemným zaokrouhlovacím chybám a dalším zdrojům nepřesnosti.
Aby se předešlo těmto problémům, často se doporučuje používat alternativní přístupy při práci s velmi velkými nebo velmi malými čísly nebo když je vyžadována vysoká přesnost. Například:
- Použití aritmetika s pevnou řádovou čárkou nebo desítková aritmetika , který poskytuje pevný počet desetinných míst s přesností a zabraňuje chybám při zaokrouhlování.
- Použití libovolná přesnost knihovny jako 'mpmath' nebo 'gmpy2' , které umožňují provádět výpočty s velmi vysokou přesností a vyhnout se chybám při zaokrouhlování.
Jedním důležitým aspektem je, že při provádění aritmetických operací na číslech s plovoucí desetinnou čárkou v Pythonu se můžete setkat s neočekávaným chováním kvůli způsobu, jakým aritmetika s plovoucí desetinnou čárkou funguje.
Některé aritmetické operace mohou mít za následek velmi malá nebo velmi velká čísla, která nelze přesně vyjádřit pomocí aritmetiky s plovoucí desetinnou čárkou. V těchto případech může být výsledek zaoblený nebo zkrácený , což vede k neočekávanému chování nebo nepřesnostem ve vašich výpočtech.
Aritmetika s plovoucí desetinnou čárkou není asociativní , což znamená, že pořadí, ve kterém provádíte operace, může ovlivnit výsledek. Například, (a + b) + c se nemusí rovnat a + (b + c) kvůli zaokrouhlovacím chybám a dalším zdrojům nepřesnosti.
Aritmetika s plovoucí desetinnou čárkou také není distribuční , což znamená, že (a + b) * c se nemusí rovnat a * c + b * c kvůli zaokrouhlovacím chybám a dalším zdrojům nepřesnosti. Aby se minimalizoval dopad těchto problémů, často se doporučuje používat matematický modul nebo jiné numerické knihovny, které poskytují funkce pro provádění aritmetických operací na číslech s plovoucí desetinnou čárkou přesnějším a spolehlivějším způsobem. Je také dobrým zvykem vyhýbat se porovnávání čísel s pohyblivou řádovou čárkou pro rovnost a místo toho používat práh tolerance nebo jiné metody pro porovnávání velikosti rozdílu mezi dvěma hodnotami.
Příklad:
Ukažme si příklad, jak na to aritmetika s plovoucí desetinnou čárkou může vést k neočekávanému chování v pythonu:
a = 0.1 b = 0.2 c = 0.3 result1 = (a + b) + c result2 = a + (b + c) print(result1) print(result2)
Výstup:
0.6000000000000001 0.6
Vysvětlení:
V tomto příkladu provádíme dva různé výpočty s použitím stejných hodnot a, b, a C . V prvním výpočtu přidáme A a b nejprve a poté přidejte výsledek do C . Ve druhém výpočtu přidáme b a C nejprve a poté přidejte výsledek do A .
Můžeme očekávat, že oba výpočty poskytnou stejný výsledek, protože používají stejné hodnoty a, b , a C . Kvůli omezením aritmetiky s plovoucí desetinnou čárkou však tyto dva výpočty poskytují mírně odlišné výsledky.
První výpočet poskytne výsledek 0,6000000000000001 , zatímco druhý výpočet produkuje výsledek 0,6 . Je to proto, že mezivýsledky prvního výpočtu se mírně liší od mezivýsledků druhého výpočtu kvůli chybám zaokrouhlování a dalším zdrojům nepřesnosti.
Chcete-li se těmto problémům vyhnout, často se doporučuje používat desítkový modul nebo jiné způsoby provedení aritmetické operace na plovoucí bod čísla přesnějším a spolehlivějším způsobem.
Napří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ýstup:
0.6 0.6
Vysvětlení:
V tomto příkladu používáme desítkový modul provádět stejné výpočty pomocí pevný bod aritmetika s přesností 1 desetinné místo. Umožňuje nám to vyhnout se zaokrouhlovacím chybám a dalším zdrojům nepřesnosti, které mohou ovlivnit plovoucí bod aritmetický. Výsledkem je, že oba výpočty produkují stejný výsledek 0,6 .