Maximální využití čísel s desetinnými místy

Photo of author

By etechblogcz

V programovacím jazyce Python se často setkáváme s datovým typem `float`. Tento typ slouží k reprezentaci čísel s plovoucí desetinnou čárkou. Jde o čísla, která mohou být jak kladná, tak záporná, a mají desetinnou část. Do této kategorie spadají i čísla zapsaná ve vědeckém formátu, kde se k označení mocniny deseti používá symbol „e“ nebo „E“.

Datový typ `float` má klíčový význam, protože umožňuje reprezentovat širokou škálu reálných čísel, a to jak velmi malých, tak i velmi velkých.

Níže uvádíme několik příkladů čísel s plovoucí desetinnou čárkou, jak je definujeme v Pythonu:

# příklady čísel typu float
a = 20.0
b = -51.51345
c = 65e7
d = -1.08E12
e = 2E10

print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))

Výstup z uvedeného kódu bude:

<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>

Čísla s plovoucí desetinnou čárkou poskytují přesnější výpočty ve srovnání s celými čísly. Zatímco celá čísla by například číslo 3,142 zkrátila na 3, datový typ `float` uchová číslo s desetinnou částí, tedy 3,142. Proto je `float` vhodnější pro matematické operace, které vyžadují vysokou přesnost.

Díky své přesnosti se `float` hojně využívá v oblastech jako modelování reálného světa, strojové učení, datová věda, finanční a ekonomické analýzy, matematické výpočty, grafika, vizualizace a vědecko-technické aplikace.

Celá čísla vs. Čísla s plovoucí desetinnou čárkou v Pythonu

Kromě `float` jsou v Pythonu velmi populární celá čísla, reprezentovaná datovým typem `int`. Na rozdíl od čísel s plovoucí desetinnou čárkou, celá čísla nemají desetinnou část. Zahrnují kladná celá čísla, záporná celá čísla a nulu.

Celá čísla jsou ideální pro operace, které pracují s celými hodnotami, jako je počítání nebo indexování.

Příklady celých čísel v Pythonu jsou:

a = 0
b = 968
c = -14

print(type(a))
print(type(b))
print(type(c))

Výstup:

<class 'int'>
<class 'int'>
<class 'int'>

Hlavní rozdíly mezi celými čísly a čísly s plovoucí desetinnou čárkou v Pythonu:

Charakteristika Celá čísla (int) Čísla s plovoucí desetinnou čárkou (float)
Reprezentace Celá čísla, jejich záporné protějšky a nula, bez desetinné části. Reálná čísla s desetinnou částí.
Přesnost Neomezená přesnost, omezená pouze dostupnou pamětí. Omezená přesnost, maximální hodnota přibližně 1.8 x 10308.
Využití paměti Obvykle méně paměti. Větší nároky na paměť než u celých čísel.
Bitové operace Běžně využívané v bitových operacích. Prakticky se nepoužívají.
Typické použití Počítání, indexování, bitové operace. Měření, vědecké výpočty, většina matematických operací.

Různé způsoby vytváření a použití čísel s plovoucí desetinnou čárkou v Pythonu

Nejjednodušší způsob, jak začít pracovat s typem `float` v Pythonu, je přiřadit proměnné hodnotu typu `float`:

# přiřazení hodnoty float proměnné
a = 3.142

Další možností je převést celá čísla nebo číselné řetězce na typ `float` pomocí konstruktoru `float()`. Tento konstruktor převede celočíselnou hodnotu i číselný řetězec na číselnou hodnotu s plovoucí desetinnou čárkou:

number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# Konverze na float a uložení do proměnné
a = float(number1)
print(a)
b = float(numString1)
print(b)
c = float(numString2)
print(c)

Výstup:

2524.0
513.523
1341.0

V příkladu výše se celé číslo a číselné řetězce převedly na typ `float` a uložily do proměnných, které následně vytiskneme. Výsledkem je hodnota s plovoucí desetinnou čárkou.

Dalším způsobem, jak získat `float`, je pomocí matematických výpočtů, například dělením:

num1 = 20
num2 = 3
result = num1/num2
print("Výsledek dělení jako celé číslo:")
print(int(20/3))
print("Výsledek dělení jako float:")
print(result)
print(type(result))

Výstup:

Výsledek dělení jako celé číslo:
6
Výsledek dělení jako float:
6.666666666666667
<class 'float'>

Zde vidíme, že typ `float` nám poskytuje přesnější výsledek dělení než použití celočíselného dělení.

Při práci s čísly s plovoucí desetinnou čárkou můžeme narazit na zajímavé výsledky způsobené tím, jak jsou tyto hodnoty interně uloženy v počítači. Čísla s plovoucí desetinnou čárkou jsou totiž uložena jako binární zlomky se základem 2. Většina desetinných zlomků nelze přesně reprezentovat jako binární zlomek, zvláště pokud jde o opakující se desetinná místa. Proto se `float` obvykle ukládají jako aproximace skutečné hodnoty.

Jako příklad si můžeme vzít hodnotu 0,3. Interně se 0,3 neuloží jako přesná hodnota 0,3. Chceme-li se přesvědčit, můžeme použít funkci `format()`, která nám umožní zobrazit libovolný počet platných číslic dané hodnoty. V následujícím příkladu zobrazíme 0,3 až na 20 desetinných míst:

num = 0.3
print("num na 20 desetinných míst")
print(format(num, '.20f'))
print("Hodnota, kterou jsme uložili do num")
print(num)

Výstup:

num na 20 desetinných míst
0.29999999999999998890
Hodnota, kterou jsme uložili do num
0.3

Je zřejmé, že hodnota 0,3 není v paměti uložena přesně. Při tisku proměnné dostáváme zaokrouhlenou hodnotu.

Tato skutečnost může vést k neočekávaným výsledkům při výpočtech. Například 0,3 + 0,3 + 0,3 by mělo být 0,9. Nicméně, jak ukazuje Python, tomu tak není, protože interně ukládá binární aproximace skutečné hodnoty:

sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Je součet roven výsledku: ")
print(sum == answer)
print("Interní reprezentace součtu je: ")
print(sum)
print("Výsledek z manuálního výpočtu je: ")
print(answer)

Výstup:

Je součet roven výsledku:
False
Interní reprezentace součtu je:
0.8999999999999999
Výsledek z manuálního výpočtu je:
0.9

Je tedy důležité mít na paměti, že Python neukládá přesné hodnoty čísel s plovoucí desetinnou čárkou, ale jejich aproximace. Při porovnávání hodnot `float` je vhodné zaokrouhlit je na stejný počet platných číslic. Pokud potřebujete vyšší přesnost, je doporučeno použít vestavěný modul `decimal`.

Desítkový modul v Pythonu

V situacích, kdy je vyžadována vysoká přesnost, zejména ve finančních nebo vědeckých výpočtech, není datový typ `float` nejlepším řešením. Pro přesnou práci s čísly s plovoucí desetinnou čárkou použijeme modul `decimal`.

Na rozdíl od `float`, který se ukládá jako binární reprezentace závislá na stroji, modul `decimal` ukládá čísla s plovoucí desetinnou čárkou v desítkové reprezentaci, která je na stroji nezávislá, čímž dosahuje vyšší přesnosti.

Desítkový modul je schopný reprezentovat desetinná čísla přesně tak, jak je zadáváme, a používat je v této podobě při výpočtech. Také nabízí správně zaokrouhlenou aritmetiku s plovoucí desetinnou čárkou.

Chcete-li začít používat desítkový modul, je potřeba jej importovat:

import decimal

Pro srovnání si ukážeme, jak by vypadal dřívější příklad s porovnáním součtu 0,3 + 0,3 + 0,3 s hodnotou 0,9, za použití modulu `decimal`:

import decimal

sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Je součet roven výsledku: ")
print(sum == answer)
print("Interní reprezentace součtu je: ")
print(sum)
print("Výsledek z manuálního výpočtu je: ")
print(answer)

Výstup:

Je součet roven výsledku:
True
Interní reprezentace součtu je:
0.9
Výsledek z manuálního výpočtu je:
0.9

Jak vidíme, pro situace vyžadující vysokou přesnost je použití modulu `decimal` nezbytné.

Běžné chyby při práci s čísly s plovoucí desetinnou čárkou

Mnohé chyby při práci s typem `float` pramení z nepochopení, jak jsou čísla s plovoucí desetinnou čárkou interně reprezentována v Pythonu. Vzhledem k tomu, že Python neukládá hodnoty přesně, ale jako aproximace, můžete se setkat s chybami, pokud očekáváte, že hodnoty budou uloženy tak, jak byly zadány.

Jednou z častých chyb je chyba zaokrouhlování při provádění matematických výpočtů. Kvůli tomu, že Python neukládá přesné hodnoty, mohou být výsledky výpočtů odlišné od očekávaných.

Vzhledem k těmto chybám se můžete setkat s problémy při porovnávání rovnosti mezi hodnotami s plovoucí desetinnou čárkou. Proto je důležité při práci s `float` být obezřetný a brát v úvahu, že se mohou objevit neočekávané výsledky.

Nejlepším způsobem, jak se vyhnout chybám při práci s `float`, je použití desítkového modulu. Získáte tak předvídatelné a přesné výsledky při výpočtech s čísly s plovoucí desetinnou čárkou.

Závěr

Jako programátor v Pythonu se s datovým typem `float` setkáte velmi často. Abyste předešli chybám při práci s ním, je důležité pochopit, jak Python interně reprezentuje čísla s plovoucí desetinnou čárkou. Pamatujte, že Python neukládá přesné hodnoty `float`, proto se vyhněte přímému porovnávání rovnosti. V opačném případě mohou nastat chyby.

Pokud ve vaší aplikaci potřebujete přesné výsledky, nepoužívejte `float`, ale desítkový modul. Ten nabízí přesné výsledky výpočtů s čísly s plovoucí desetinnou čárkou a reprezentuje je přesně tak, jak jsou zadány, a to nezávisle na konkrétním počítači.

Dále si můžete přečíst o funkcích Python Itertools a konstrukci Python Try Except.