Pohyblivá řádová čárkaComputerphile
10
Počítače by měly být přeci dokonale přesné, tak proč nám tvrdí, že 0,1 + 0,2 = 0,3000...1?
Přepis titulků
Lidé očekávají, že počítače budou s čísly naprosto přesné. Vyrůstáte s kalkulačkou a očekáváte, že když napíšete 0,1 + 0,2, tak vyjde 0,3. A dříve či později každý programátor něco takového zkusí napsat. A napíšou to v programovacím jazyce. Něco jako 0,1 + 0,2. Stisknou Enter a počítač jim napíše něco jako 0,3000...1. A v ten moment se dozví o pohyblivé řádové čárce a začnou si trhat vlasy.
Pohyblivá řádová čárka je v podstatě vědecká notace. Řekněme, že jste astrofyzik a máte rychlost světla, což je tohle ohromné číslo s osmi nulami. A chceme ho vynásobit velmi krátkou vzdáleností. Ani nezáleží, co měříme, jde jen o velké a malé číslo. Třeba 0,000...15. Řekněme, že je chceme vynásobit.
Udělal jsem to schválně snadné. Mohli byste zkusit nějakou komplikovanou matematiku a vyřešit to, ale nemusíte. Protože ve vědecké notaci je tohle 3x10^8. A tohle je 1,5x10^-7. Nemusíte dělat nic moc složitého, abyste je vynásobili. Stačí jen vynásobit tyto, což je 4,5 a pak sečíst tyto exponenty. Takže 8 + (-7) = 1. Vyjde nám 4,5x10^1 neboli 4,5x10 neboli 45.
Paráda, to je o dost snazší než zkoušet pracovat s velkými čísly. A také nás to přivádí ke konceptu platných číslic, protože rychlost světla není přesně 3x10^8, ale 2,997...něco. Na konci je spousta číslic, které nejsou pro běžné výpočty podstatné. Zaokrouhlíme to a řekneme, že je to 3x10^8. Nebo abychom byli přesní, tak 2,997x10^8, ale čísla za tím nás moc nezajímají. Udržte tu myšlenku, k platným číslicím se vrátíme později.
Dvě hlavní výhody pohyblivé řádové čárky jsou rychlost a efektivita. Rychlost, protože pohyblivá řádová čárka se používá už mnoho let a počítače si s ní dnes poradí velmi rychle. A efektivita, protože se vypořádá s opravdu velkými čísly velikosti vesmíru a velmi malými čísly velikosti atomu bez potřeby ohromného množství prostoru. Pokud byste měli formát, který by zahrnoval velikost vesmíru a velikost atomu, tak byste potřebovali tolik nul na obou koncích, nebo něco obzvlášť komplikovaného, aby to počítač zpracoval, že by to bylo buď velmi neefektivní, ukládat jedno číslo jako megabajt, nebo byste potřebovali něco velmi složitého pro počítač, když by se pokoušel zpracovat všechna ta čísla.
Promluvme si o desítkové soustavě, o nás, lidech. O náhle zapnutých světlech, divný... V desítkové soustavě, našich normálních lidských číslech... Deset číslic, desítková soustava. Máme stovky, desítky, jednotky, což znáte ze základní školy.
A pak máme desetiny, setiny a tisíciny. Když máte v desítkové soustavě jednu desetinu, tak to znamená 0,1. To je normální a přirozené. V binární soustavě počítačů to tak ale není. Protože ty vidí čtyřky, dvojky, jedničky a pak poloviny, čtvrtiny, osminy a šestnáctiny. Není tam žádná 0,1. Vlastně, 0,1 v binární soustavě je 0,00011. A to 0011 je periodické.
Je to tedy 0,000110011... a tak dál až do nekonečna, což je zajímavé, protože 32-bitové počítače, které používáme, ukládají jen 23 platných číslic. Také ukládají, kde je desetinná čárka. Vlastně dělají vědecké notace v binární soustavě, což je pohyblivá řádová čárka. Takže máme tohle dlouhé binární číslo krát dvě na několikátou. A to je problém, protože tím ztrácí přesnost. Nerozumí periodicitě. A v desítkové soustavě je pro to analogie.
Když se pokusíte zapsat třetinu decimálně, tak máme stovky, desítky, jednotky, desetiny, setiny, tisíciny a pak to zkusíme a skončíme s 0,333... periodických. A teď si představte, že nerozumíte periodickým číslům. Jako počítač, jako když je z vědecké notace vyjmuta ta perioda. Stejně jako pohyblivá řádová čárka nerozumí. Tady dáme všechno dohromady. Když jste v desítkové soustavě, tak řekněme, že máte 1/3 + 1/3 +1/3.
Jako lidé počítáme, 0,3 periodických + 0,3 periodických + 0,3 periodických, což je 1. Ale řekněme, že jste počítač a nerozumíte periodicitě, protože pohyblivá řádová čárka jsou v základu platné číslice. Takže počítač by počítal 0,33333... + 0,333... + 0,333... a sečte to na 0,999999... A po chvíli přestane, protože mu dojdou číslice. A právě tomu se říká zaokrouhlovací chyba pohyblivé řádové čárky.
Zkusme to v binární soustavě. Zkusme 1/10 + 2/10. Což je 0,000110011... až nám dojdou číslice, protože aritmetika pohyblivé řádové čárky na 32-bitových počítačích ukládá jen 23 číslic. A pak přičteme 2/10, což je 0,00110011... Nebudou to zkoušet, protože by to trvalo věky, ale stane se přesně to samé co tady. Po 23 číslicích v 32-bitové aritmetice, v 64-bitech by to bylo 56 číslic, se to usekne, protože to nerozumí periodicitě. Takže pohyblivá řádová čárka se podívá na 1/10 + 2/10, což jste právě napsali, 0,1 + 0,2 v desítkové soustavě, a řekne, že 1/10 + 2/10 ≠ 3/10.
Protože pro pohyblivou řádovou čárku se to nerovná. Téměř ve všech případech je to dostatečně přesné. Většinou nepotřebujete víc než 23 čísel 32-bitové přesnosti, pokud ano, tak použijete 64-bitů. Když děláte 3D hru a potřebujete vědět, kde něco na obrazovce zobrazit, tak nezáleží, jestli je to o setinu nebo tisícinu pixelu mimo, protože to bude na správném místě.
A když děláte velké výpočty, tak nezáleží, pokud malinký zlomek, něco malého jako molekula, je mimo, protože to bude vypadat víceméně správně. Správně podle každé přesnostní tolerance, kterou by mohl skutečný svět potřebovat. Ale znamená to, že když se zabýváte měnou a sčítáte 10 pencí neboli 0,1 liber k 20 pencím, tak na tohle každý programátor dříve či později narazí.
My počítáme takhle, snadné. Počítač ale řekne, že je to vlastně tolik pencí. A pak u těchto specifických lidských věcí si té chyby všimneme, protože je nám to najednou opravdu zřejmé. To je problém s pohyblivou řádovou čárkou a pro opravu při práci s měnami buď použijete decimální datový typ v pokročilejších programovacích jazycích nebo vše uložíte jako celé číslo (integer) v případě pencí nebo centů a na konci vydělíte stem.
Pohyblivá řádová čárka je něco, co opravdu mate hodně lidí. Dokud si neuvědomíte, že je to jen vědecká notace. Stejná věc, jakou jsme se učili ve škole. Jen v binární soustavě. Jsou to poloviny, čtvrtiny a osminy. A jakmile si uvědomíte, že to ukládá danou délku čísla a pak zjišťuje, kde má být desetinná čárka a jsou to jen platné číslice. Začne to být o dost snazší. A začnete si uvědomovat, proč když napíšete 0,1 + 0,2, tak nedostanete 0,3.
Překlad: Foxtrot www.videacesky.cz
Pohyblivá řádová čárka je v podstatě vědecká notace. Řekněme, že jste astrofyzik a máte rychlost světla, což je tohle ohromné číslo s osmi nulami. A chceme ho vynásobit velmi krátkou vzdáleností. Ani nezáleží, co měříme, jde jen o velké a malé číslo. Třeba 0,000...15. Řekněme, že je chceme vynásobit.
Udělal jsem to schválně snadné. Mohli byste zkusit nějakou komplikovanou matematiku a vyřešit to, ale nemusíte. Protože ve vědecké notaci je tohle 3x10^8. A tohle je 1,5x10^-7. Nemusíte dělat nic moc složitého, abyste je vynásobili. Stačí jen vynásobit tyto, což je 4,5 a pak sečíst tyto exponenty. Takže 8 + (-7) = 1. Vyjde nám 4,5x10^1 neboli 4,5x10 neboli 45.
Paráda, to je o dost snazší než zkoušet pracovat s velkými čísly. A také nás to přivádí ke konceptu platných číslic, protože rychlost světla není přesně 3x10^8, ale 2,997...něco. Na konci je spousta číslic, které nejsou pro běžné výpočty podstatné. Zaokrouhlíme to a řekneme, že je to 3x10^8. Nebo abychom byli přesní, tak 2,997x10^8, ale čísla za tím nás moc nezajímají. Udržte tu myšlenku, k platným číslicím se vrátíme později.
Dvě hlavní výhody pohyblivé řádové čárky jsou rychlost a efektivita. Rychlost, protože pohyblivá řádová čárka se používá už mnoho let a počítače si s ní dnes poradí velmi rychle. A efektivita, protože se vypořádá s opravdu velkými čísly velikosti vesmíru a velmi malými čísly velikosti atomu bez potřeby ohromného množství prostoru. Pokud byste měli formát, který by zahrnoval velikost vesmíru a velikost atomu, tak byste potřebovali tolik nul na obou koncích, nebo něco obzvlášť komplikovaného, aby to počítač zpracoval, že by to bylo buď velmi neefektivní, ukládat jedno číslo jako megabajt, nebo byste potřebovali něco velmi složitého pro počítač, když by se pokoušel zpracovat všechna ta čísla.
Promluvme si o desítkové soustavě, o nás, lidech. O náhle zapnutých světlech, divný... V desítkové soustavě, našich normálních lidských číslech... Deset číslic, desítková soustava. Máme stovky, desítky, jednotky, což znáte ze základní školy.
A pak máme desetiny, setiny a tisíciny. Když máte v desítkové soustavě jednu desetinu, tak to znamená 0,1. To je normální a přirozené. V binární soustavě počítačů to tak ale není. Protože ty vidí čtyřky, dvojky, jedničky a pak poloviny, čtvrtiny, osminy a šestnáctiny. Není tam žádná 0,1. Vlastně, 0,1 v binární soustavě je 0,00011. A to 0011 je periodické.
Je to tedy 0,000110011... a tak dál až do nekonečna, což je zajímavé, protože 32-bitové počítače, které používáme, ukládají jen 23 platných číslic. Také ukládají, kde je desetinná čárka. Vlastně dělají vědecké notace v binární soustavě, což je pohyblivá řádová čárka. Takže máme tohle dlouhé binární číslo krát dvě na několikátou. A to je problém, protože tím ztrácí přesnost. Nerozumí periodicitě. A v desítkové soustavě je pro to analogie.
Když se pokusíte zapsat třetinu decimálně, tak máme stovky, desítky, jednotky, desetiny, setiny, tisíciny a pak to zkusíme a skončíme s 0,333... periodických. A teď si představte, že nerozumíte periodickým číslům. Jako počítač, jako když je z vědecké notace vyjmuta ta perioda. Stejně jako pohyblivá řádová čárka nerozumí. Tady dáme všechno dohromady. Když jste v desítkové soustavě, tak řekněme, že máte 1/3 + 1/3 +1/3.
Jako lidé počítáme, 0,3 periodických + 0,3 periodických + 0,3 periodických, což je 1. Ale řekněme, že jste počítač a nerozumíte periodicitě, protože pohyblivá řádová čárka jsou v základu platné číslice. Takže počítač by počítal 0,33333... + 0,333... + 0,333... a sečte to na 0,999999... A po chvíli přestane, protože mu dojdou číslice. A právě tomu se říká zaokrouhlovací chyba pohyblivé řádové čárky.
Zkusme to v binární soustavě. Zkusme 1/10 + 2/10. Což je 0,000110011... až nám dojdou číslice, protože aritmetika pohyblivé řádové čárky na 32-bitových počítačích ukládá jen 23 číslic. A pak přičteme 2/10, což je 0,00110011... Nebudou to zkoušet, protože by to trvalo věky, ale stane se přesně to samé co tady. Po 23 číslicích v 32-bitové aritmetice, v 64-bitech by to bylo 56 číslic, se to usekne, protože to nerozumí periodicitě. Takže pohyblivá řádová čárka se podívá na 1/10 + 2/10, což jste právě napsali, 0,1 + 0,2 v desítkové soustavě, a řekne, že 1/10 + 2/10 ≠ 3/10.
Protože pro pohyblivou řádovou čárku se to nerovná. Téměř ve všech případech je to dostatečně přesné. Většinou nepotřebujete víc než 23 čísel 32-bitové přesnosti, pokud ano, tak použijete 64-bitů. Když děláte 3D hru a potřebujete vědět, kde něco na obrazovce zobrazit, tak nezáleží, jestli je to o setinu nebo tisícinu pixelu mimo, protože to bude na správném místě.
A když děláte velké výpočty, tak nezáleží, pokud malinký zlomek, něco malého jako molekula, je mimo, protože to bude vypadat víceméně správně. Správně podle každé přesnostní tolerance, kterou by mohl skutečný svět potřebovat. Ale znamená to, že když se zabýváte měnou a sčítáte 10 pencí neboli 0,1 liber k 20 pencím, tak na tohle každý programátor dříve či později narazí.
My počítáme takhle, snadné. Počítač ale řekne, že je to vlastně tolik pencí. A pak u těchto specifických lidských věcí si té chyby všimneme, protože je nám to najednou opravdu zřejmé. To je problém s pohyblivou řádovou čárkou a pro opravu při práci s měnami buď použijete decimální datový typ v pokročilejších programovacích jazycích nebo vše uložíte jako celé číslo (integer) v případě pencí nebo centů a na konci vydělíte stem.
Pohyblivá řádová čárka je něco, co opravdu mate hodně lidí. Dokud si neuvědomíte, že je to jen vědecká notace. Stejná věc, jakou jsme se učili ve škole. Jen v binární soustavě. Jsou to poloviny, čtvrtiny a osminy. A jakmile si uvědomíte, že to ukládá danou délku čísla a pak zjišťuje, kde má být desetinná čárka a jsou to jen platné číslice. Začne to být o dost snazší. A začnete si uvědomovat, proč když napíšete 0,1 + 0,2, tak nedostanete 0,3.
Překlad: Foxtrot www.videacesky.cz


Komentáře (0)