Aritmetika s pohyblivou řádovou čárkou - Floating-point arithmetic

Časný elektromechanický programovatelný počítač Z3 obsahoval aritmetiku s pohyblivou řádovou čárkou (replika vystavena v Deutsches Museum v Mnichově ).

Při výpočtu , s plovoucí desetinnou čárkou aritmetický ( FP ) je aritmetický použití stereotypní reprezentace reálných čísel jako aproximace pro podporu kompromis mezi rozsah a přesnost. Z tohoto důvodu se výpočet s plovoucí desetinnou čárkou často používá v systémech s velmi malými a velmi velkými reálnými čísly, které vyžadují rychlé doby zpracování. Obecně je číslo s plovoucí desetinnou čárkou reprezentováno přibližně pevným počtem platných číslic (dále jen „ význam“ ) a je škálováno pomocí exponentu v nějaké pevné základně; základ pro škálování je obvykle dva, deset nebo šestnáct. Číslo, které lze přesně reprezentovat, má následující formu:

kde význam je celé číslo , základna je celé číslo větší nebo rovné dvěma a exponent je také celé číslo. Například:

Termín s plovoucí desetinnou čárkou odkazuje na skutečnost, že radixová číslice čísla ( desetinná čárka , nebo, v počítačích běžněji, binární tečka ) může „plavat“; to znamená, že může být umístěn kdekoli vzhledem k významným číslicím čísla. Tato poloha je označována jako exponentní komponenta, a proto lze reprezentaci s plovoucí desetinnou čárkou považovat za druh vědecké notace .

Systém s plovoucí desetinnou čárkou lze použít k znázornění, s pevným počtem číslic, čísel různých řádů : např. Vzdálenost mezi galaxiemi nebo průměr atomového jádra lze vyjádřit stejnou jednotkou délky. Výsledkem tohoto dynamického rozsahu je, že čísla, která lze reprezentovat, nejsou rozmístěna rovnoměrně; rozdíl mezi dvěma po sobě jdoucími reprezentovatelnými čísly se liší podle zvolené stupnice.

Čísla s plovoucí desetinnou čárkou s jednoduchou přesností na číselném řádku : zelené čáry označují reprezentovatelné hodnoty.
Rozšířená verze výše ukazuje oba znaky reprezentativních hodnot

V průběhu let byla v počítačích používána řada reprezentací s plovoucí desetinnou čárkou. V roce 1985 byla zavedena norma IEEE 754 pro aritmetiku s pohyblivou řádovou čárkou a od 90. let 20. století se nejčastěji vyskytují reprezentace definované IEEE.

Rychlost operací s plovoucí desetinnou čárkou, běžně měřená pomocí FLOPS , je důležitou charakteristikou počítačového systému , zejména pro aplikace, které zahrnují intenzivní matematické výpočty.

Jednotka s plovoucí desetinnou čárkou (FPU, hovorově matematický koprocesor ) je část počítačového systému speciálně navrženého k provádění operací s čísly s plovoucí desetinnou čárkou.

Přehled

Čísla s plovoucí desetinnou čárkou

Číselná reprezentace určuje nějaký způsob kódování čísla, obvykle jako řetězec číslic.

Existuje několik mechanismů, kterými mohou řetězce číslic reprezentovat čísla. V běžné matematické notaci může mít číselný řetězec libovolnou délku a umístění bodu radixu je indikováno umístěním explicitního znaku „bodu“ (tečka nebo čárka). Není-li radixový bod určen, pak řetězec implicitně představuje celé číslo a neuvedený radixový bod by byl mimo pravý konec řetězce, vedle nejméně významné číslice. V systémech s pevným bodem je pro bod radix určena poloha v řetězci. Schéma s pevnou řádovou čárkou tedy může být použití řetězce 8 desetinných číslic s desetinnou čárkou uprostřed, přičemž „00012345“ by představovalo 0001,2345.

Ve vědecké notaci je dané číslo zmenšeno o mocninu 10 , takže leží v určitém rozmezí - obvykle mezi 1 a 10, přičemž bod radixu se objevuje bezprostředně za první číslicí. Faktor škálování, jako mocnina deseti, je pak uveden samostatně na konci čísla. Například oběžná doba Jupiterova měsíce Io je152 853,5047 sekund, hodnota, která by byla reprezentována ve standardním vědeckém zápisu jako1,528535047 × 10 5 sekund.

Reprezentace s plovoucí desetinnou čárkou je svým konceptem podobná vědecké notaci. Logicky se číslo s plovoucí desetinnou čárkou skládá z:

  • Podepsaný (což znamená kladný nebo záporný) číselný řetězec dané délky v dané základně (nebo radixu ). Tento číselný řetězec se označuje jako význam , mantisa nebo koeficient . Délka významu určuje přesnost, s jakou lze čísla reprezentovat. Předpokládá se, že poloha radixového bodu je vždy někde v rámci významu - často těsně po nebo těsně před nejvýznamnější číslicí, nebo napravo od nejzazší (nejméně významné) číslice. Tento článek obecně dodržuje konvenci, že bod radixu je nastaven hned za nejvýznamnější (nejvíce vlevo) číslicí.
  • Celočíselný exponent se znaménkem (označovaný také jako charakteristika nebo měřítko ), který mění velikost čísla.

K odvození hodnoty čísla s plovoucí desetinnou čárkou se význam vynásobí základnou zvýšenou na mocninu exponentu , což odpovídá posunutí bodu radixu z jeho implicitní polohy o počet míst rovných hodnotě exponentu-na vpravo, pokud je exponent kladný, nebo doleva, pokud je exponent záporný.

Jako příklad použijeme základnu 10 (známý desítkový zápis)152 853,5047 , který má desetinnou číslici přesnosti, je reprezentován jako význam1 528 535 047 společně s 5 jako exponentem. Pro určení skutečné hodnoty, desetinná tečka je umístěna za první číslici mantisy a výsledek se vynásobí 10 5 , čímž se získá1,528535047 × 10 5 , nebo152 853,5047 . Při ukládání takového čísla nemusí být uložena základna (10), protože bude stejná pro celý rozsah podporovaných čísel, a lze ji tedy odvodit.

Symbolicky je tato konečná hodnota:

kde s je význam (ignoruje jakoukoli implikovanou desetinnou čárku), p je přesnost (počet číslic v významu), b je základna (v našem případě je to číslo deset ) a e je exponent.

Historicky bylo pro reprezentaci čísel s plovoucí desetinnou čárkou použito několik číselných základen, přičemž nejčastější je základna dvě ( binární ), následovaná základnou deset ( desetinná čárka ) a další méně obvyklé varianty, jako je základna šestnáctka ( hexadecimální plovoucí desetinná čárka) ), základna osm (osmičkový plovoucí bod), základna čtyři (kvartérní plovoucí desetinná čárka), báze tři ( vyvážená ternární plovoucí desetinná čárka ) a sudá základna 256 a báze65 536 .

Číslo s plovoucí desetinnou čárkou je racionální číslo , protože jej lze znázornit jako jedno celé číslo dělené druhým; například1,45 × 10 3 je (145/100) × 1000 nebo145 000/100 . Základ určuje zlomky, které lze reprezentovat; například 1/5 nemůže být reprezentována přesně jako číslo s plovoucí desetinnou čárkou pomocí binární báze, ale 1/5 může být reprezentována přesně pomocí desítkové báze (0,2 nebo2 × 10 −1 ). 1/3 však nemůže být reprezentována přesně ani binárně (0,010101 ...) ani desítkově (0,333 ...), ale v základu 3 je triviální (0,1 nebo 1 × 3 −1 ). Příležitosti, při kterých dochází k nekonečným expanzím, závisí na základně a jejích hlavních faktorech .

Způsob, jakým jsou v počítači uloženy význam (včetně jeho znaménka) a exponent, závisí na implementaci. Běžné formáty IEEE jsou podrobně popsány později a jinde, ale jako příklad v binární reprezentaci s plovoucí desetinnou čárkou s jednoduchou přesností (32 bitů) , a proto je významem řetězec 24 bitů . Například prvních 33 bitů čísla π je:

V této binární expanzi označme pozice od 0 (bit zcela vlevo nebo nejvýznamnější bit) do 32 (bit zcela vpravo). 24bitový význam se zastaví na pozici 23, zobrazen jako podtržený bit0 výše. Další bit, na pozici 24, se nazývá kulatý bit nebo zaokrouhlovací bit . Slouží k zaokrouhlení 33bitové aproximace na nejbližší 24bitové číslo ( pro poloviční hodnoty existují specifická pravidla , což v tomto případě neplatí). Tento bit, který je1 v tomto příkladu se přidá k celému číslu tvořenému 24 bity zcela vlevo, čímž se získá:

Když je toto uloženo v paměti pomocí kódování IEEE 754, stane se to důležitým s . Předpokládá se, že mantinel má binární bod vpravo od bitu nejvíce vlevo. Binární reprezentace π se tedy vypočítá zleva doprava takto:

kde p je přesnost (24 v tomto příkladu), n je pozice bitu významu zleva (počínaje od0 a končí v23 zde) a e je exponent (1 v tomto příkladu).

Lze požadovat, aby nejvýznamnější číslice významu nenulového čísla byla nenulová (kromě případů, kdy by odpovídající exponent byl menší než minimální). Tento proces se nazývá normalizace . Pro binární formáty (které používají pouze číslice0 a1 ), tato nenulová číslice nutně je1 . Proto nemusí být zastoupen v paměti; umožňující formátu mít ještě jeden kousek přesnosti. Toto pravidlo se různě nazývá úvodní bitová konvence , implicitní bitová konvence , skrytá bitová konvence nebo předpokládaná bitová konvence .

Alternativy k číslům s plovoucí desetinnou čárkou

Reprezentace s plovoucí desetinnou čárkou je zdaleka nejběžnějším způsobem reprezentace v počítačích sbližování se skutečnými čísly. Existují však alternativy:

  • Reprezentace s pevným bodem využívá celočíselné hardwarové operace řízené softwarovou implementací konkrétní konvence o umístění binární nebo desetinné čárky, například 6 bitů nebo číslic zprava. Hardware pro manipulaci s těmito reprezentacemi je méně nákladný než s plovoucí desetinnou čárkou a lze jej použít i k provádění běžných celočíselných operací. Binární pevný bod se obvykle používá ve speciálních aplikacích na vestavěných procesorech, které umí pouze celočíselnou aritmetiku, ale desítkový pevný bod je v komerčních aplikacích běžný.
  • Logaritmické číselné systémy (LNS) představují skutečné číslo logaritmem jeho absolutní hodnoty a znaménkovým bitem. Rozdělení hodnot je podobné jako s plovoucí desetinnou čárkou, ale křivka hodnoty k reprezentaci ( tj . Graf logaritmické funkce) je hladká (kromě 0). Na rozdíl od aritmetiky s pohyblivou řádovou čárkou je v logaritmickém číselném systému implementace, dělení a umocňování jednoduchá, ale sčítání a odčítání jsou složité. ( Symetrická ) aritmetika hladinového indexu (LI a SLI) Charlese Clenshawa, Franka Olvera a Petera Turnera je schéma založené na generalizované logaritmické reprezentaci.
  • Zúžená reprezentace s plovoucí desetinnou čárkou , která se v praxi nezdá být použita.
  • Tam, kde je požadována větší přesnost, lze implementovat aritmetiku s pohyblivou řádovou čárkou (obvykle v softwaru) s proměnnými délkami (a někdy i exponenty), jejichž velikost závisí na skutečné potřebě a v závislosti na tom, jak výpočet pokračuje. Tomu se říká aritmetika s plovoucí desetinnou čárkou s libovolnou přesností .
  • Rozšíření s plovoucí desetinnou čárkou jsou dalším způsobem, jak dosáhnout větší přesnosti, díky hardwaru s plovoucí desetinnou čárkou: číslo je reprezentováno jako nevyhodnocený součet několika čísel s plovoucí desetinnou čárkou. Příkladem je double-double aritmetický , někdy používá pro typ C long double.
  • Některá jednoduchá racionální čísla ( např . 1/3 a 1/10) nelze přesně vyjádřit v binární plovoucí desetinné čárce, bez ohledu na přesnost. Použití jiného radixu umožňuje reprezentovat některé z nich ( např . 1/10 s desetinnou čárkou), ale možnosti zůstávají omezené. Softwarové balíky, které provádějí racionální aritmetiku, představují čísla jako zlomky s integrálním čitatelem a jmenovatelem, a proto mohou přesně reprezentovat jakékoli racionální číslo. Takové balíčky obecně musí používat aritmetiku „ bignum “ pro jednotlivá celá čísla.
  • Intervalová aritmetika umožňuje reprezentovat čísla jako intervaly a získat zaručené hranice výsledků. Obecně je založen na jiné aritmetice, zejména na plovoucí desetinné čárce.
  • Systémy počítačové algebry, jako jsou Mathematica , Maxima a Maple, často dokážou zpracovat iracionální čísla podobně nebo zcela „formálně“, aniž by se zabývaly konkrétním kódováním významu. Takový program dokáže přesně vyhodnotit výrazy jako „ “, protože je naprogramován tak, aby zpracovával základní matematiku přímo, namísto použití přibližných hodnot pro každý mezilehlý výpočet.

Dějiny

V roce 1914, Leonardo Torres Quevedo y navrhli elektromechanickou verzi Charles Babbage ‚s analytické motoru , a zahrnoval s plovoucí desetinnou čárkou aritmetika. V roce 1938 Konrad Zuse z Berlína dokončil Z1 , první binární, programovatelný mechanický počítač ; používá 24bitovou binární reprezentaci čísla s plovoucí desetinnou čárkou se 7bitovým podepsaným exponentem, 17bitovým významem (včetně jednoho implicitního bitu) a znaménkovým bitem. Čím více spolehlivější relé na bázi Z3 , dokončena v roce 1941, má zastoupení na pozitivní i negativní nekonečna; zejména implementuje definované operace s nekonečnem, jako například , a zastaví se u nedefinovaných operací, jako je .

Konrad Zuse , architekt počítače Z3 , který používá 22bitovou binární reprezentaci s plovoucí desetinnou čárkou

Zuse také navrhl, ale nedokončil, pečlivě zaoblenou aritmetiku s plovoucí desetinnou čárkou, která zahrnuje reprezentace NaN a předvídá vlastnosti standardu IEEE o čtyři desetiletí. Naproti tomu von Neumann doporučil proti číslům s plovoucí desetinnou čárkou pro stroj IAS 1951 tvrdit, že je vhodnější aritmetika s pevnou řádovou čárkou.

První komerční počítač s hardwarem s plovoucí desetinnou čárkou byl počítač Zuse Z4 , navržený v letech 1942–1945. V roce 1946 Bell Laboratories představil Mark V, který implementoval desetinná čísla s plovoucí desetinnou čárkou .

Pilot ACE má binární s pohyblivou řádovou čárkou, a zahájila činnost v roce 1950 v National Physical Laboratory, UK . Třicet tři bylo později komerčně prodáno jako English Electric DEUCE . Aritmetika je ve skutečnosti implementována softwarově, ale s hodinovou frekvencí jeden megahertz byla rychlost operací s plovoucí desetinnou čárkou a operací s pevným bodem v tomto počítači zpočátku vyšší než u mnoha konkurenčních počítačů.

V roce 1954 následoval sériově vyráběný IBM 704 ; zavedlo použití předpojatého exponentu . Po mnoho desetiletí poté byl hardware s plovoucí desetinnou čárkou obvykle volitelnou funkcí a o počítačích, které jej měly, se hovořilo jako o „vědeckých počítačích“ nebo o schopnostech „ vědeckých výpočtů “ (SC) (viz také Rozšíření pro vědecké výpočty (XSC) )). Až při uvedení Intel i486 v roce 1989 na trh měly osobní počítače pro všeobecné účely standardní schopnost hardwaru s plovoucí desetinnou čárkou.

Řada UNIVAC 1100/2200 , představená v roce 1962, podporovala dvě zobrazení s plovoucí desetinnou čárkou:

  • Jedna přesnost : 36 bitů, uspořádaných jako 1bitový znak, 8bitový exponent a 27bitový význam.
  • Dvojitá přesnost : 72 bitů, uspořádaných jako 1bitový znak, 11bitový exponent a 60bitový význam.

IBM 7094 , také představil v roce 1962, podporuje jednoduchou přesností a dvojitou přesností reprezentace, ale bez vztahu k UNIVAC je reprezentací. V roce 1964 představila společnost IBM ve svých sálových počítačích System/360 hexadecimální reprezentace s plovoucí desetinnou čárkou ; stejná zobrazení jsou stále k dispozici pro použití v moderních systémech z/Architecture . V roce 1998 však IBM zahrnula do svých sálových počítačů binární aritmetiku s pohyblivou řádovou čárkou kompatibilní s IEEE; v roce 2005 IBM také přidala aritmetiku desítkové čárky s desetinnou čárkou kompatibilní s IEEE.

Počítače zpočátku používaly pro čísla s plovoucí desetinnou čárkou mnoho různých reprezentací. Nedostatek standardizace na úrovni sálových počítačů byl pokračujícím problémem na začátku 70. let pro ty, kteří psali a udržovali zdrojový kód vyšší úrovně; tyto normy výrobce s plovoucí desetinnou čárkou se lišily velikostí slov, reprezentací a chováním zaokrouhlování a obecnou přesností operací. Kompatibilita s pohyblivou řádovou čárkou napříč více výpočetními systémy zoufale potřebovala standardizaci počátkem 80. let, což vedlo k vytvoření standardu IEEE 754, jakmile se 32bitové (nebo 64bitové) slovo stalo běžným. Tento standard byl výrazně založen na návrhu společnosti Intel, která navrhovala numerický koprocesor i8087 ; Motorola, která navrhovala 68000 přibližně ve stejnou dobu, také poskytla významný příspěvek.

V roce 1989 byl matematik a počítačový vědec William Kahan oceněn Turingovou cenou za to, že byl hlavním architektem tohoto návrhu; pomáhal mu jeho student (Jerome Coonen) a hostující profesor (Harold Stone).

Mezi novinky x86 patří:

  • Přesně specifikovaná reprezentace s plovoucí desetinnou čárkou na úrovni bitových řetězců, takže všechny kompatibilní počítače interpretují bitové vzory stejným způsobem. To umožňuje přesně a efektivně přenášet čísla s plovoucí desetinnou čárkou z jednoho počítače do druhého (po započítání endianness ).
  • Přesně specifikované chování pro aritmetické operace: Výsledek musí být vytvořen, jako by byla použita nekonečně přesná aritmetika k získání hodnoty, která je poté zaokrouhlena podle konkrétních pravidel. To znamená, že vyhovující počítačový program by vždy poskytoval stejný výsledek při daném konkrétním vstupu, čímž by se zmírnila téměř mystická pověst, kterou si výpočet s plovoucí desetinnou čárkou vyvinul pro své dosud zdánlivě nedeterministické chování.
  • Schopnost výjimečných podmínek (přetečení, dělení nulou atd.) Šířit se pomocí výpočtu neškodným způsobem a poté být řízena softwarem.

Rozsah čísel s plovoucí desetinnou čárkou

Číslo s plovoucí desetinnou čárkou se skládá ze dvou komponent s pevnou řádovou čárkou , jejichž rozsah závisí výhradně na počtu bitů nebo číslic v jejich zobrazení. Zatímco komponenty lineárně závisí na jejich rozsahu, rozsah s plovoucí desetinnou čárkou lineárně závisí na významném rozsahu a exponenciálně na rozsahu exponentní komponenty, která k číslu připojuje mimořádně širší rozsah.

V typickém počítačovém systému má binární číslo s dvojitou přesností (64bitové) s plovoucí desetinnou čárkou koeficient 53 bitů (včetně 1 implikovaného bitu), exponent 11 bitů a 1 znakový bit. Protože 2 10 = 1024, úplný rozsah kladných normálních čísel s plovoucí desetinnou čárkou v tomto formátu je od 2 −1022  ≈ 2 × 10 −308 do přibližně 2 1024  ≈ 2 × 10 308 .

Počet normalizovaných čísel s plovoucí desetinnou čárkou v systému ( B , P , L , U ) kde

  • B je základem systému,
  • P je přesnost významu (v základně B ),
  • L je nejmenší exponent systému,
  • U je největší exponent systému,

je .

Existuje nejmenší kladné normalizované číslo s plovoucí desetinnou čárkou,

Úroveň podtečení = UFL = ,

který má 1 jako počáteční číslici a 0 pro zbývající číslice významu a nejmenší možnou hodnotu pro exponent.

Existuje největší číslo s plovoucí desetinnou čárkou,

Úroveň přetečení = OFL = ,

který má B - 1 jako hodnotu pro každou číslici významu a největší možnou hodnotu pro exponent.

Kromě toho existují reprezentativní hodnoty striktně mezi −UFL a UFL. Totiž kladné a záporné nuly , stejně jako denormalizovaná čísla .

IEEE 754: plovoucí desetinná čárka v moderních počítačích

IEEE standardizované počítačovou reprezentaci čísla binární s plovoucí desetinnou čárkou v IEEE 754 (aka IEC 60559) v roce 1985. Tento první standard následuje téměř ve všech moderních strojů. Byl revidován v roce 2008 . Sálové počítače IBM podporují kromě binárního formátu IEEE 754 také vlastní hexadecimální formát s plovoucí desetinnou čárkou IBM a desítkovou desetinnou čárku IEEE 754-2008 . Řada Cray T90 měla verzi IEEE, ale SV1 stále používá formát Cray s plovoucí desetinnou čárkou.

Standard poskytuje mnoho úzce souvisejících formátů, lišících se pouze v několika detailech. Pět z těchto formátů se nazývá základní formáty a další se nazývají rozšířené přesné formáty a rozšiřitelné přesné formáty . V počítačovém hardwaru a jazycích se používají zejména tři formáty:

  • Jedna přesnost (binary32), obvykle používaná k reprezentaci typu „float“ v jazykové rodině C (i když to není zaručeno ). Jedná se o binární formát, který zabírá 32 bitů (4 bajty) a jeho význam má přesnost 24 bitů (asi 7 desetinných číslic).
  • Dvojitá přesnost (binary64), obvykle používaná k reprezentaci typu „double“ v jazykové rodině C (i když to není zaručeno ). Jedná se o binární formát, který zabírá 64 bitů (8 bajtů) a jeho význam má přesnost 53 bitů (asi 16 desetinných číslic).
  • Dvojitě rozšířený , také dvojznačně nazývaný formát „prodloužená přesnost“. Jedná se o binární formát, který zabírá alespoň 79 bitů (80, pokud není použito pravidlo skrytých/implicitních bitů) a jeho význam má přesnost alespoň 64 bitů (asi 19 desetinných číslic). K C99 a C11 normy jazyka C rodiny v jejich příloze F ( „IEC 60559 s plovoucí desetinnou čárkou aritmetický“), doporučujeme takový rozšířený formát, které mají být poskytnuty jako „ dlouho double “. Formát vyhovující minimálním požadavkům (64bitová významná přesnost, 15bitový exponent, takže pasující na 80 bitů) poskytuje architektura x86 . Na takových procesorech lze tento formát často použít s „dlouhým dvojitým“, ačkoli u MSVC není k dispozici rozšířená přesnost. Pro účely zarovnání mnoho nástrojů ukládá tuto 80bitovou hodnotu do 96bitového nebo 128bitového prostoru. Na jiných procesorech může „dlouhý dvojitý“ znamenat větší formát, například čtyřnásobnou přesnost nebo jen dvojitou přesnost, pokud není k dispozici žádná forma rozšířené přesnosti.

Zvýšení přesnosti zobrazení s plovoucí desetinnou čárkou obecně snižuje množství akumulované chyby zaokrouhlení způsobené mezilehlými výpočty. Mezi méně běžné formáty IEEE patří:

  • Čtyřnásobná přesnost (binární 128). Jedná se o binární formát, který zabírá 128 bitů (16 bajtů) a jeho význam má přesnost 113 bitů (asi 34 desetinných číslic).
  • Decimal64 a decimal128 formáty s plovoucí desetinnou čárkou . Tyto formáty jsou společně s formátem decimal32 určeny pro správné zaokrouhlování desetinných míst.
  • Poloviční přesnost , také nazývaná binary16, 16bitová hodnota s plovoucí desetinnou čárkou. Používá se v grafickém jazyce NVIDIA Cg a ve standardu openEXR.

Libovolné celé číslo s absolutní hodnotou menší než 2 24 lze přesně vyjádřit ve formátu s jednou přesností a jakékoli celé číslo s absolutní hodnotou menší než 2 53 lze přesně vyjádřit ve formátu s dvojitou přesností. Kromě toho může být zastoupena široká škála sil 2krát větší než toto číslo. Tyto vlastnosti se někdy používají pro čistě celočíselná data k získání 53bitových celých čísel na platformách, které mají dvojitou přesnost, ale pouze 32bitová celá čísla.

Standard specifikuje některé speciální hodnoty a jejich zastoupení: kladná nekonečnost (+∞), záporná nekonečnost (−∞), záporná nula (−0) odlišná od běžné („kladné“) nuly a hodnoty „není číslo“ ( NaN ).

Porovnání čísel s plovoucí desetinnou čárkou, jak je definováno standardem IEEE, se trochu liší od běžného porovnávání celých čísel. Negativní a kladná nula se porovnávají stejně a každá NaN se nerovná každé hodnotě, včetně sebe. Všechna konečná čísla s plovoucí desetinnou čárkou jsou přísně menší než +∞ a přísně větší než −∞ a jsou uspořádána stejným způsobem jako jejich hodnoty (v sadě reálných čísel).

Vnitřní reprezentace

Čísla s plovoucí desetinnou čárkou jsou obvykle zabalena do počátečního bodu počítače jako znakový bit, pole exponentu a význam nebo mantisa zleva doprava. Pro binární formáty IEEE 754 (základní a rozšířené), které mají existující hardwarové implementace, jsou rozděleny následovně:

Typ Podepsat Exponent Významné pole Celkem bitů Exponent zaujatost Přesnost bitů Počet desetinných míst
Polovina ( IEEE 754-2008 ) 1 5 10 16 15 11 ~ 3.3
Singl 1 8 23 32 127 24 ~ 7,2
Dvojnásobek 1 11 52 64 1023 53 ~ 15,9
Rozšířená přesnost x86 1 15 64 80 16383 64 ~ 19.2
Quad 1 15 112 128 16383 113 ~ 34,0

Zatímco exponent může být kladný nebo záporný, v binárních formátech je uložen jako nepodepsané číslo, do kterého je přidáno pevné „zkreslení“. Hodnoty všech 0 v tomto poli jsou vyhrazeny pro nuly a podnormální čísla ; hodnoty všech 1 s jsou vyhrazeny pro nekonečna a NaN. Rozsah exponentů pro normalizovaná čísla je [−126, 127] pro jednoduchou přesnost, [−1022, 1023] pro dvojité nebo [−16382, 16383] pro čtveřici. Normalizovaná čísla vylučují subnormální hodnoty, nuly, nekonečna a NaN.

Ve formátech binární výměny IEEE není úvodní 1 bit normalizovaného významu ve skutečnosti uložen v počátečním bodu počítače. Říká se mu „skrytý“ nebo „implicitní“ bit. Z tohoto důvodu má formát s jednou přesností skutečně význam s 24 bity přesnosti, formát s dvojitou přesností má 53 a quad má 113.

Výše bylo například ukázáno, že π, zaokrouhleno na 24 bitů přesnosti, má:

  • znaménko = 0; e = 1; s = 110010010000111111011011 (včetně skrytého bitu)

Součet zkreslení exponentu (127) a exponentu (1) je 128, takže je to ve formátu s jednou přesností reprezentováno jako

  • 0 10000000 10010010000111111011011 (bez skrytého bitu) = 40490FDB jako hexadecimální číslo.

Příklad rozložení pro 32bitovou plovoucí desetinnou čárkou je

Float example.svg

a 64bitové rozložení je podobné .

Zvláštní hodnoty

Podepsaná nula

Ve standardu IEEE 754 je nula podepsána, což znamená, že existuje „kladná nula“ (+0) i „záporná nula“ (-0). Ve většině prostředí run-time je kladná nula obvykle vytištěna jako " 0" a záporná nula jako " -0". Tyto dvě hodnoty se při numerickém srovnání chovají stejně, ale některé operace vracejí různé výsledky pro +0 a -0. Například 1/( - 0) vrátí záporné nekonečno, zatímco 1/+0 vrátí kladné nekonečno (aby byla zachována identita 1/(1/± ∞) = ± ∞). Další běžné funkce s nespojitostí na x = 0, což by mohlo léčení +0 a -0 jinak zahrnují log ( x ), signum ( x ), a hlavní odmocninu z y + xi pro jakýkoli záporné číslo y . Jako u každého přibližného schématu, operace zahrnující „zápornou nulu“ mohou příležitostně způsobit zmatek. Například v IEEE 754 x = y neznamená vždy 1/ x = 1/ y , protože 0 = −0, ale 1/0 ≠ 1/ −0 .

Podnormální čísla

Subnormální hodnoty zaplnit podtečení mezeru s hodnotami, kde je absolutní vzdálenost mezi nimi je stejná jako pro sousední hodnoty těsně mimo výtoku mezery. Toto je vylepšení oproti starším postupům, když je v podtékové mezeře pouze nula a kde podtékající výsledky byly nahrazeny nulou (flush na nulu).

Moderní hardware s plovoucí desetinnou čárkou obvykle zpracovává subnormální hodnoty (stejně jako normální hodnoty) a pro subnormály nevyžaduje softwarovou emulaci.

Nekonečna

Nekonečna rozšířené řady reálných čísel mohou být reprezentována v datových typech s plovoucí desetinnou čárkou IEEE, stejně jako běžné hodnoty s plovoucí desetinnou čárkou, jako je 1, 1,5 atd. Nejsou žádným způsobem chybové hodnoty, i když jsou často (ale ne vždy, protože to závisí na zaokrouhlení) používané jako náhradní hodnoty při přetečení. Po výjimce dělení nulou se vrátí pozitivní nebo negativní nekonečno jako přesný výsledek. Nekonečno lze také zavést jako číslici (jako makro C „INFINITY“ nebo „∞“, pokud programovací jazyk umožňuje tuto syntaxi).

IEEE 754 vyžaduje, aby s nekonečny bylo zacházeno rozumným způsobem, jako např

  • (+∞)+(+7) = (+∞)
  • (+∞) × (−2) = (−∞)
  • (+∞) × 0 = NaN - nedá se dělat nic smysluplného

NaNs

IEEE 754 specifikuje speciální hodnotu s názvem „Not a Number“ (NaN), která má být vrácena v důsledku určitých „neplatných“ operací, například 0/0, ∞ × 0 nebo sqrt (−1). Obecně budou NaN šířeny, tj. Většina operací zahrnujících NaN bude mít za následek NaN, ačkoli funkce, které by poskytly nějaký definovaný výsledek pro jakoukoli danou hodnotu s plovoucí desetinnou čárkou, to budou dělat i pro NaN, např. NaN ^ 0 = 1. Existují dva druhy NaN: výchozí tiché NaN a volitelně signalizační NaN. Signalizační NaN v jakékoli aritmetické operaci (včetně numerických srovnání) způsobí signalizaci výjimky „neplatné operace“ .

Reprezentace NaN specifikovaná standardem má některé nespecifikované bity, které by mohly být použity ke kódování typu nebo zdroje chyby; ale pro toto kódování neexistuje žádný standard. Teoreticky by signalizační NaN mohl runtime systém použít k označení neinicializovaných proměnných nebo k rozšíření čísel s plovoucí desetinnou čárkou o další speciální hodnoty bez zpomalení výpočtů s běžnými hodnotami, ačkoli taková rozšíření nejsou běžná.

Odůvodnění návrhu IEEE 754

William Kahan . Primární architekt koprocesoru s plovoucí desetinnou čárkou Intel 80x87 a standardu IEEE 754 s plovoucí desetinnou čárkou.

Je běžnou mylnou představou, že esoteričtější rysy standardu IEEE 754, které jsou zde diskutovány, jako jsou rozšířené formáty, NaN, nekonečna, subnormály atd., Jsou zajímavé pouze pro numerické analytiky nebo pro pokročilé numerické aplikace; ve skutečnosti je opak pravdou: tyto funkce jsou navrženy tak, aby kromě podpory sofistikovaných numerických knihoven odborníky poskytovaly bezpečná robustní výchozí nastavení pro numericky nenáročné programátory. Klíčový návrhář IEEE 754 William Kahan poznamenává, že je nesprávné „... [deem] rysy IEEE Standard 754 pro binární aritmetiku s pohyblivou řádovou čárkou, které ... [nejsou] oceňovány jako funkce použitelné nikým jiným než číselným odborníci. Fakta jsou zcela opačná. V roce 1977 byly tyto funkce navrženy do Intel 8087, aby sloužily co nejširšímu trhu ... Analýza chyb nám říká, jak navrhnout aritmetiku s plovoucí desetinnou čárkou, jako je IEEE Standard 754, mírně tolerantní k dobře -to znamená nevědomost mezi programátory “.

  • Speciální hodnoty, jako je nekonečno a NaN, zajišťují, že aritmetika s pohyblivou řádovou čárkou je algebraicky úplná: každá operace s plovoucí desetinnou čárkou vytvoří přesně definovaný výsledek a nebude-ve výchozím nastavení-vyvolávat přerušení nebo past stroje. Navíc volby zvláštních hodnot vrácených ve výjimečných případech byly navrženy tak, aby v mnoha případech poskytly správnou odpověď. Například podle aritmetiky IEEE 754 pokračující zlomky jako R (z): = 7 - 3/[z - 2 - 1/(z - 7 + 10/[z - 2 - 2/(z - 3)]) ] dá správnou odpověď na všechny vstupy, protože dělení potenciálu nulou, např. pro z = 3 , je správně zpracováno zadáním +nekonečna, a tak lze takové výjimky bezpečně ignorovat. Jak poznamenal Kahan, neošetřená past po sobě jdoucí k přetečení konverze s plovoucí desetinnou čárkou na 16bitové celé číslo, která způsobila ztrátu rakety Ariane 5, by se podle výchozí zásady IEEE 754 s plovoucí desetinnou čárkou nestalo.
  • Podnormální čísla zajišťují, že pro konečná čísla s plovoucí desetinnou čárkou x a y x-y = 0 právě tehdy, když x = y, jak se očekávalo, ale která neplatila pod dřívějšími reprezentacemi s plovoucí desetinnou čárkou.
  • K návrhovému zdůvodnění 80bitového formátu x87 Kahan poznamenává: „Tento rozšířený formát je určen k použití se zanedbatelnou ztrátou rychlosti pro všechny kromě nejjednodušší aritmetiky s floatovými a dvojitými operandy. Například by měl být použit pro proměnné typu scratch ve smyčkách, které implementují rekurence, jako je polynomiální hodnocení, skalární součin, částečné a pokračující zlomky. Často odvrací předčasné přetečení/podtečení nebo závažné lokální zrušení, které může zkazit jednoduché algoritmy “. Výpočetní mezivýsledky v rozšířeném formátu s vysokou přesností a prodlouženou exponent má precedens v historické praxi vědeckých výpočtů a při navrhování vědecká kalkulačka např Hewlett-Packard ‚s finanční kalkulačky provedeny aritmetické a finanční funkce na tři významnější desetinná místa, než ukládají nebo zobrazené. Implementace rozšířené přesnosti umožnila snadno vyvinout standardní knihovny základních funkcí, které za normálních okolností poskytovaly výsledky s dvojitou přesností v rámci jedné jednotky na posledním místě (ULP) vysokou rychlostí.
  • Správné zaokrouhlení hodnot na nejbližší reprezentovatelnou hodnotu zamezuje systematickému zkreslování výpočtů a zpomaluje růst chyb. Zaokrouhlováním vazeb se dokonce odstraní statistické zkreslení, ke kterému může dojít při přidávání podobných čísel.
  • Směrované zaokrouhlování bylo zamýšleno jako pomůcka při kontrole hranic chyb, například v intervalové aritmetice . Používá se také při implementaci některých funkcí.
  • Matematický základ operací, zejména správné zaokrouhlení, umožňuje dokázat matematické vlastnosti a navrhnout algoritmy s plovoucí desetinnou čárkou, jako je 2Sum, Fast2Sum a Kahanův sumační algoritmus , např. Zlepšit přesnost nebo relativně snadno implementovat aritmetické podprogramy s více přesnostmi.

Vlastností formátů s jednoduchou a dvojitou přesností je, že jejich kódování umožňuje jejich snadné třídění bez použití hardwaru s plovoucí desetinnou čárkou. Jejich bity interpretované jako celé číslo s dvojitým komplementem již správně řadí pozitiva, s negativy obrácenými. Když xor převrátí znaménkový bit pro kladné hodnoty a všechny bity pro záporné hodnoty, všechny hodnoty se stanou seřaditelnými jako celá čísla bez znaménka (s -0 <+0 ). Není jasné, zda je tato vlastnost zamýšlena.

Jiné pozoruhodné formáty s plovoucí desetinnou čárkou

Kromě široce používaných standardních formátů IEEE 754 se v určitých oblastech specifických pro doménu používají nebo byly použity i jiné formáty s plovoucí desetinnou čárkou.

  • Microsoft binární formát (MBF) vyvinul pro jazykové produkty Microsoft BASIC, včetně vůbec první produkt společnosti Microsoft je Altair BASIC (1975), TRS-80 LEVEL II , CP / M 's MBASIC , IBM PC 5150 ' s Basica , MS DOS ‚s GW-BASIC a QuickBASIC před verzí 4.00. QuickBASIC verze 4.00 a 4.50 přešel na formát IEEE 754-1985, ale může se vrátit do formátu MBF pomocí možnosti příkazu /MBF. MBF byl navržen a vyvinut na simulovaném Intel 8080 společností Monte Davidoff , dormant Bill Gates , na jaře 1975 pro MITS Altair 8800 . Počáteční vydání z července 1975 podporovalo formát s jednou přesností (32 bitů) kvůli ceně paměti MITS Altair 8800 4 kilobajtů. V prosinci 1975 přidala verze o 8 kilobajtech formát s dvojitou přesností (64 bitů). Pro jiné CPU byl přijat variantní formát s jedinou přesností (40 bitů), zejména pro MOS 6502 ( Apple // , Commodore PET , Atari ), Motorola 6800 (MITS Altair 680) a Motorola 6809 ( TRS-80 Color Computer ). Všechny jazykové produkty společnosti Microsoft od roku 1975 do roku 1987 používaly binární formát Microsoft, dokud společnost Microsoft nepřijala standardní formát IEEE-754 ve všech svých produktech počínaje rokem 1988 až po jejich aktuální vydání. MBF se skládá z formátu MBF s jednou přesností (32 bitů, „6místný BASIC“), formátu MBF s rozšířenou přesností (40 bitů, „9místný BASIC“) a formátu MBF s dvojitou přesností (64 bitů) ; každý z nich je reprezentován 8bitovým exponentem, následovaným znaménkovým bitem, následovaným významem 23, 31 a 55 bitů.
  • Formát Bfloat16 vyžaduje stejné množství paměti (16 bitů) jako formát s poloviční přesností IEEE 754 , ale místo 5 přiděluje exponentu 8 bitů, čímž poskytuje stejný rozsah jako číslo s jednou přesností IEEE 754 . Kompromisem je snížená přesnost, protože pole koncového významu je sníženo z 10 na 7 bitů. Tento formát se používá hlavně při školení modelů strojového učení , kde je dosah cennější než přesnost. Mnoho akcelerátorů strojového učení poskytuje hardwarovou podporu pro tento formát.
  • Formát TensorFloat-32 poskytuje to nejlepší z formátů Bfloat16 a polopřesnosti, přičemž jako první má 8 bitů exponent a jako poslední 10 bitů koncové významné pole. Tento formát zavedla společnost Nvidia , která pro něj poskytuje hardwarovou podporu v jádrech Tensor svých GPU založených na architektuře Nvidia Ampere. Nevýhodou tohoto formátu je jeho celková velikost 19 bitů, což není síla 2. Podle Nvidie by však tento formát měl interně používat hardware pouze pro zrychlení výpočtů, zatímco vstupy a výstupy by měly být uloženy v 32bitový formát IEEE 754 s jednou přesností.
Specifikace formátů Bfloat16 a TensorFloat-32, ve srovnání se standardními formáty poloviční přesnosti IEEE 754 a jednoduchou přesností
Typ Podepsat Exponent Koncové pole významů Celkem bitů
Poloviční přesnost 1 5 10 16
Bfloat16 1 8 7 16
TensorFloat-32 1 8 10 19
Jednoduchá přesnost 1 8 23 32

Reprezentativní čísla, převod a zaokrouhlení

Ze své podstaty jsou všechna čísla vyjádřená ve formátu s plovoucí desetinnou čárkou racionální čísla s koncovou expanzí v příslušné základně (například koncová desítková expanze v základně-10 nebo končící binární expanze v základně-2). Iracionální čísla, jako jsou π nebo √2, nebo nekončící racionální čísla, musí být aproximována. Počet číslic (nebo bitů) přesnosti také omezuje množinu racionálních čísel, která lze přesně znázornit. Například desetinné číslo 123456789 nelze přesně zastoupeny, jsou-li k dispozici pouze osm desetinná místa přesnosti (to by se zaokrouhlí na jednu ze dvou tažných reprezentovatelných hodnot, 12345678 × 10 1 nebo 12345679 x 10 1 ), to samé platí pro non -končící číslice ( .5 zaokrouhlete buď na .55555555 nebo .55555556).

Když je číslo reprezentováno v nějakém formátu (například v řetězci znaků), který není nativní reprezentací s plovoucí desetinnou čárkou podporovanou v počítačové implementaci, bude před jeho použitím v této implementaci vyžadovat převod. Pokud lze číslo reprezentovat přesně ve formátu s plovoucí desetinnou čárkou, pak je převod přesný. Pokud neexistuje přesná reprezentace, pak převod vyžaduje výběr čísla s plovoucí desetinnou čárkou, které se použije k reprezentaci původní hodnoty. Zvolená reprezentace bude mít jinou hodnotu než původní a takto upravená hodnota se nazývá zaokrouhlená hodnota .

Zda má racionální číslo koncovou expanzi, závisí na základně. Například v základně-10 má číslo 1/2 koncovou expanzi (0,5), zatímco číslo 1/3 nikoli (0,333 ...). V základu 2 končí pouze racionály se jmenovateli, které mají mocniny 2 (například 1/2 nebo 3/16). Každý racionální se jmenovatelem, který má primární faktor jiný než 2, bude mít nekonečnou binární expanzi. To znamená, že čísla, která se zdají být krátká a přesná, jsou-li zapsána v desítkovém formátu, může být nutné při převodu na binární desetinnou čárku aproximovat. Například desetinné číslo 0,1 nelze reprezentovat v binární plovoucí desetinné čárce žádné konečné přesnosti; přesná binární reprezentace by měla nekonečnou sekvenci „1100“:

e = -4; s = 1100110011001100110011001100110011 ...,

kde, jako dříve, s je význam a e je exponent.

Po zaokrouhlení na 24 bitů se to stane

e = -4; s = 110011001100110011001101,

což je ve skutečnosti 0,100000001490116119384765625 v desítkové soustavě.

Jako další příklad je reálné číslo π , reprezentované binárně jako nekonečná posloupnost bitů

11.001001000011111101101010101000100010000101101000110000100011010011 ...

ale je

11.0010010000111111011011

při aproximaci zaokrouhlením na přesnost 24 bitů.

V binární plovoucí desetinné čárce s jednoduchou přesností je to reprezentováno jako s  = 1,10010010000111111011011 s e  = 1. Toto má desetinnou hodnotu

3.141592 7410125732421875,

zatímco přesnější aproximace skutečné hodnoty π je

3,14159265358979323846264338327950 ...

Výsledek zaokrouhlení se liší od skutečné hodnoty přibližně o 0,03 části na milion a odpovídá desetinnému vyjádření π v prvních 7 číslicích. Rozdílem je chyba diskretizace a je omezena epsilonem stroje .

Aritmetický rozdíl mezi dvěma po sobě jdoucími reprezentovatelnými čísly s plovoucí desetinnou čárkou, které mají stejný exponent, se nazývá jednotka na posledním místě (ULP). Pokud například mezi reprezentovatelnými čísly 1,45a70c22 hex a 1,45a70c24 hex není žádné reprezentovatelné číslo , ULP je 2 × 16 −8 nebo 2 −31 . U čísel s exponentní částí báze 2 0, tj. Čísel s absolutní hodnotou vyšší nebo rovnou 1, ale nižší než 2, je ULP přesně 2 −23 nebo přibližně 10 −7 s jednoduchou přesností a přesně 2 −53 nebo asi 10 −16 s dvojitou přesností. Povinným chováním hardwaru kompatibilního s IEEE je, že výsledek je do poloviny ULP.

Režimy zaokrouhlování

Zaokrouhlení se používá v případě, že by přesný výsledek operace s plovoucí desetinnou čárkou (nebo převod na formát s plovoucí desetinnou čárkou) vyžadoval více číslic, než kolik je číslic v významu. IEEE 754 vyžaduje správné zaokrouhlení : to znamená, že zaokrouhlený výsledek je, jako by pro výpočet hodnoty byla použita nekonečně přesná aritmetika, a poté zaokrouhlen (i když v implementaci jsou k tomu zapotřebí pouze tři další bity). Existuje několik různých schémat zaokrouhlování (nebo režimů zaokrouhlování ). Historicky bylo zkrácení typickým přístupem. Od zavedení IEEE 754 se běžně používá výchozí metoda ( zaokrouhlení na nejbližší, vazby na sudé , někdy také nazývané Banker's Rounding). Tato metoda zaokrouhlí ideální (nekonečně přesný) výsledek aritmetické operace na nejbližší reprezentovatelnou hodnotu a jako výsledek uvede tuto reprezentaci. V případě nerozhodného výsledku je zvolena hodnota, která by znamenala konec na sudé číslici. Standard IEEE 754 vyžaduje, aby stejné zaokrouhlení bylo aplikováno na všechny základní algebraické operace, včetně odmocniny a převodů, pokud dojde k číselnému výsledku (bez NaN). To znamená, že výsledky operací IEEE 754 jsou zcela určeny ve všech bitech výsledku, kromě reprezentace NaN. (Funkce „knihovny“, jako kosinus a log, nejsou nařízeny.)

K dispozici jsou také alternativní možnosti zaokrouhlení. IEEE 754 specifikuje následující režimy zaokrouhlování:

  • zaokrouhlit na nejbližší, kde se zaokrouhlí na nejbližší sudou číslici v požadované pozici (výchozí a zdaleka nejběžnější režim)
  • zaokrouhlit na nejbližší, kde se vazby zaokrouhlují od nuly (volitelně pro binární s plovoucí desetinnou čárkou a běžně používané v desítkové soustavě)
  • zaokrouhlit nahoru (směrem k +∞; negativní výsledky tedy zaokrouhlit k nule)
  • zaokrouhlit dolů (směrem k −∞; negativní výsledky tedy zaokrouhlit od nuly)
  • zaokrouhlit na nulu (zkrácení; je to podobné běžnému chování převodů typu float-to-integer, které převádějí −3,9 na −3 a 3,9 na 3)

Alternativní režimy jsou užitečné tam, kde musí být omezeno množství zaváděné chyby. Aplikace, které vyžadují ohraničenou chybu, jsou aritmetika s plovoucí desetinnou čárkou s více přesnostmi a intervalová aritmetika . Alternativní režimy zaokrouhlování jsou také užitečné při diagnostice numerické nestability: pokud se výsledky podprogramu podstatně liší mezi zaokrouhlením na + a-nekonečno, pak je pravděpodobně numericky nestabilní a ovlivněna chybou zaokrouhlení.

Převod binárních na desetinná čísla s minimálním počtem číslic

Převedení binárního čísla s plovoucí desetinnou čárkou s dvojitou přesností na desítkový řetězec je běžná operace, ale algoritmus produkující výsledky, které jsou přesné i minimální, se v tisku objevil až v roce 1990, přičemž Steele a White's Dragon4. Některá z vylepšení od té doby zahrnují:

  • Dtoa.c Davida M. Gaye , praktická open-source implementace mnoha nápadů v Dragon4.
  • Grisu3 se 4 × zrychlením, které odstraňuje použití bignumů . Musí být použit s nouzovým řešením, protože selže v ~ 0,5% případů.
  • Errol3, vždy úspěšný algoritmus podobný, ale pomalejší než Grisu3. Zjevně ne tak dobrý jako dříve ukončující Grisu s nouzovým řešením.
  • Ryū, vždy úspěšný algoritmus, který je rychlejší a jednodušší než Grisu3.

Mnoho moderních jazykových modulů runtime používá Grisu3 se záložním Dragon4.

Převod desetinných na binární

Problém parsování desetinného řetězce na binární reprezentaci FP je složitý, přičemž přesný analyzátor se neobjevuje až do Clingerovy práce z roku 1990 (implementováno v dtoa.c). Další práce rovněž pokročila ve směru rychlejší analýzy.

Aritmetické operace s pohyblivou řádovou čárkou

Pro snadnou prezentaci a porozumění bude v příkladech použit desetinný radix se sedmimístnou přesností, stejně jako ve formátu decimal32 IEEE 754 . Základní principy jsou stejné v jakémkoli radixu nebo přesnosti, kromě toho, že normalizace je volitelná (nemá vliv na číselnou hodnotu výsledku). Zde s označuje význam a e označuje exponent.

Sčítání a odčítání

Jednoduchá metoda, jak přidat čísla s plovoucí desetinnou čárkou, je nejprve je reprezentovat stejným exponentem. V níže uvedeném příkladu je druhé číslo posunuto o tři číslice doprava a jedno pokračuje obvyklou metodou sčítání:

  123456.7 = 1.234567 × 10^5
  101.7654 = 1.017654 × 10^2 = 0.001017654 × 10^5
  Hence:
  123456.7 + 101.7654 = (1.234567 × 10^5) + (1.017654 × 10^2)
                      = (1.234567 × 10^5) + (0.001017654 × 10^5)
                      = (1.234567 + 0.001017654) × 10^5
                      =  1.235584654 × 10^5

Podrobně:

  e=5;  s=1.234567     (123456.7)
+ e=2;  s=1.017654     (101.7654)
  e=5;  s=1.234567
+ e=5;  s=0.001017654  (after shifting)
--------------------
  e=5;  s=1.235584654  (true sum: 123558.4654)

Toto je skutečný výsledek, přesný součet operandů. Zaokrouhlí se na sedm číslic a v případě potřeby se normalizuje. Konečný výsledek je

  e=5;  s=1.235585    (final sum: 123558.5)

Nejnižší tři číslice druhého operandu (654) jsou v podstatě ztraceny. Toto je chyba zaokrouhlení . V extrémních případech může být součet dvou nenulových čísel roven jednomu z nich:

  e=5;  s=1.234567
+ e=−3; s=9.876543
  e=5;  s=1.234567
+ e=5;  s=0.00000009876543 (after shifting)
----------------------
  e=5;  s=1.23456709876543 (true sum)
  e=5;  s=1.234567         (after rounding and normalization)

Ve výše uvedených koncepčních příkladech by se zdálo, že sčítač musí zajistit velký počet dalších číslic, aby bylo zajištěno správné zaokrouhlení; pro binární sčítání nebo odčítání s použitím pečlivých implementačních technik je však nutné přesnost operandů přenášet pouze strážní bit, zaokrouhlovací bit a jeden extra lepivý bit.

Další problém ztráty významnosti nastává, když jsou odečteny aproximace ke dvěma téměř stejným číslům. V následujícím příkladu e  = 5; s  = 1,234571 a e  = 5; s  = 1,234567 jsou aproximace k racionálům 123457.1467 a 123456.659.

  e=5;  s=1.234571
− e=5;  s=1.234567
----------------
  e=5;  s=0.000004
  e=−1; s=4.000000 (after rounding and normalization)

Rozdíl s plovoucí desetinnou čárkou je vypočítán přesně, protože čísla jsou blízká- Sterbenzovo lemma to zaručuje, a to i v případě podtečení, kdy je podporováno postupné podtečení . Navzdory tomu je rozdíl původních čísel e  = −1; s  = 4,877 000, což se liší o více než 20% od rozdílu e  = −1; s  = 4,000000 aproximací. V extrémních případech lze ztratit všechny významné číslice přesnosti. Toto zrušení ilustruje nebezpečí za předpokladu, že všechny číslice vypočítaného výsledku mají smysl. Řešení následků těchto chyb je tématem numerické analýzy ; viz také Problémy s přesností .

Násobení a dělení

Aby se znásobily, vynásobí se významy, zatímco se přidají exponenty, a výsledek se zaokrouhlí a normalizuje.

  e=3;  s=4.734612
× e=5;  s=5.417242
-----------------------
  e=8;  s=25.648538980104 (true product)
  e=8;  s=25.64854        (after rounding)
  e=9;  s=2.564854        (after normalization)

Podobně se dělení provádí odečtením exponenta dělitele od exponenta dividendy a vydělením významu dividendy významem dělitele.

Při násobení nebo dělení nejsou žádné problémy se zrušením nebo absorpcí, přestože se malé chyby mohou hromadit při postupném provádění operací. V praxi může být způsob provádění těchto operací v digitální logice poměrně složitý (viz Boothův multiplikační algoritmus a divizní algoritmus ). Rychlou a jednoduchou metodu najdete v Hornerově metodě .

Řešení výjimečných případů

Výpočet s pohyblivou řádovou čárkou v počítači může narazit na tři druhy problémů:

  • Operace může být matematicky nedefinovaná, například ∞/∞ nebo dělení nulou .
  • Operace může být v zásadě legální, ale není podporována konkrétním formátem, například pro výpočet odmocniny −1 nebo inverzního sinusu 2 (obojí má za následek komplexní čísla ).
  • Operace může být v zásadě legální, ale výsledek může být nemožné reprezentovat v uvedeném formátu, protože exponent je příliš velký nebo příliš malý na to, aby byl kódován v poli exponent. Taková událost se nazývá přetečení (příliš velký exponent), podtečení (příliš malý exponent) nebo denormalizace (ztráta přesnosti).

Před standardem IEEE takové podmínky obvykle způsobovaly ukončení programu nebo spustily nějaký druh pasti, které by programátor mohl být schopen zachytit. Jak to fungovalo, bylo závislé na systému, což znamená, že programy s plovoucí desetinnou čárkou nebyly přenosné . (Pojem „výjimka“ používaný v IEEE 754 je obecný termín znamenající výjimečnou podmínku, což nemusí být nutně chyba, a jde o jiné použití, než jaké je obvykle definováno v programovacích jazycích, jako je C ++ nebo Java, kde „ výjimka "je alternativní tok řízení, blíže tomu, co se v terminologii IEEE 754 nazývá" past ".)

Zde je diskutován požadovaný výchozí způsob zpracování výjimek podle IEEE 754 (volitelné zachycování IEEE 754 a další režimy „zpracování alternativních výjimek“ nejsou diskutovány). Aritmetické výjimky jsou (ve výchozím nastavení) nutné zaznamenat do bitů „lepkavého“ stavového příznaku. To, že jsou „lepkavé“, znamená, že nebudou resetovány další (aritmetickou) operací, ale zůstanou nastaveny, dokud nebudou explicitně resetovány. Použití „lepivých“ příznaků tedy umožňuje, aby testování výjimečných podmínek bylo odloženo až po úplném výrazu nebo podprogramu s plovoucí desetinnou čárkou: bez nich by výjimečné podmínky, které by jinak nebylo možné ignorovat, vyžadovaly explicitní testování bezprostředně po každé operaci s plovoucí desetinnou čárkou. Ve výchozím nastavení operace vždy vrátí výsledek podle specifikace bez přerušení výpočtu. Například 1/0 vrátí +∞ a zároveň nastaví bit příznaku dělení nulou (tato výchozí hodnota ∞ je navržena tak, aby často vrátila konečný výsledek při použití v následných operacích, a proto byla bezpečně ignorována).

Původní standard IEEE 754 však nedokázal doporučit operace pro zpracování takových sad bitů příznaků aritmetických výjimek. Takže i když byly implementovány v hardwaru, implementace původně programovacího jazyka obvykle neposkytovaly prostředky k jejich přístupu (kromě assembleru). Postupem času byly některé standardy programovacích jazyků (např. C99 /C11 a Fortran) aktualizovány, aby specifikovaly metody pro přístup a změnu bitů příznakových stavů. Verze IEEE 754 z roku 2008 nyní specifikuje několik operací pro přístup a manipulaci s bity aritmetických příznaků. Programovací model je založen na jediném vláknu provádění a jejich použití více vlákny musí být řešeno prostředky mimo standard (např. C11 uvádí, že příznaky mají lokální úložiště vláken ).

IEEE 754 uvádí pět aritmetických výjimek, které mají být zaznamenány do stavových příznaků („lepivé bity“):

  • nepřesné , nastavte, pokud se zaokrouhlená (a vrácená) hodnota liší od matematicky přesného výsledku operace.
  • podtečení , nastavte, pokud je zaokrouhlená hodnota malá (jak je uvedeno v IEEE 754) a nepřesná (nebo možná omezená, pokud má ztrátu denormalizace, podle verze IEEE 754 z roku 1984), vrací subnormální hodnotu včetně nul.
  • přetečení , nastavte, pokud je absolutní hodnota zaokrouhlené hodnoty příliš velká na to, aby byla reprezentována. Vrací se nekonečno nebo maximální konečná hodnota podle toho, jaké zaokrouhlení se používá.
  • děleno nulou , nastavte, pokud je výsledek nekonečný s danými konečnými operandy, vrací nekonečno, buď +∞ nebo −∞.
  • neplatné , nastaveno, pokud nelze vrátit skutečný výsledek, např. sqrt (−1) nebo 0/0, vrací tichý NaN.
Obr. 1: odpory paralelně s celkovým odporem

Výchozí návratová hodnota pro každou z výjimek je navržena tak, aby ve většině případů poskytovala správný výsledek, takže výjimky lze u většiny kódů ignorovat. unfact vrátí správně zaokrouhlený výsledek a underflow vrátí denormalizovanou malou hodnotu, a proto může být téměř vždy ignorován. dělení nulou vrací přesně nekonečno, které pak obvykle rozdělí konečné číslo, a tak dá nulu, nebo jinak poskytne neplatnou výjimku, pokud ne, a tak může být také obvykle ignorováno. Například efektivní odpor n paralelně rezistorů (viz obr. 1) je dán vztahem . Pokud se zkrat vyvine s nastavením na 0, vrátí se +nekonečno, což dá podle očekávání konečnou hodnotu 0 (další příklad viz příklad pokračující zlomku návrhu IEEE 754 ).

Přetečení a neplatné výjimky obvykle nelze ignorovat, ale nemusí nutně představovat chyby: například rutina pro hledání kořenů , jako součást své normální operace, může vyhodnotit předanou funkci na hodnotách mimo její doménu, vrací NaN a neplatný výjimka vlajky budou ignorovány, dokud najít užitečný výchozí bod.

Problémy s přesností

Skutečnost, že čísla s plovoucí desetinnou čárkou nemohou přesně reprezentovat všechna reálná čísla a že operace s plovoucí desetinnou čárkou nemohou přesně představovat skutečné aritmetické operace, vede k mnoha překvapivým situacím. To souvisí s konečnou přesností, s jakou počítače obecně reprezentují čísla.

Například nereprezentovatelnost 0,1 a 0,01 (v binárním formátu) znamená, že výsledek pokusu o umocnění 0,1 není ani 0,01, ani reprezentativní číslo, které je tomu nejblíže. V 24bitové reprezentaci (s jednoduchou přesností) bylo dříve dáno 0,1 (desetinné) jako e  = −4 ; s  = 110011001100110011001101 , což je

0,100000001490116119384765625 přesně.

Vynásobením tohoto čísla získáte

0,010000000298023226097399174250313080847263336181640625 přesně.

Srovnáním s hardwarem s plovoucí desetinnou čárkou s jednoduchou přesností (se zaokrouhlováním) získáte

0,010000000707805156707763671875 přesně.

Ale reprezentativní číslo nejbližší 0,01 je

0,009999999776482582092285156250 přesně.

Také nereprezentovatelnost π (a π/2) znamená, že pokus o výpočet tan (π/2) nepřinese výsledek nekonečna, ani nepřetéká v obvyklých formátech s plovoucí desetinnou čárkou (za předpokladu přesné implementace opálení). Pro standardní hardware s plovoucí desetinnou čárkou není jednoduše možné pokusit se vypočítat tan (π/2), protože π/2 nelze přesně vyjádřit. Tento výpočet v C:

/* Enough digits to be sure we get the correct approximation. */
double pi = 3.1415926535897932384626433832795;
double z = tan(pi/2.0);

dá výsledek 16331239353195370.0. S jednoduchou přesností (pomocí tanffunkce) bude výsledek −22877332.0.

Ze stejného důvodu nepřinese pokus o výpočet sin (π) nulu. Výsledek bude (přibližně) 0,1225 × 10 −15 s dvojitou přesností nebo −0,8742 × 10 −7 s jednoduchou přesností.

I když sčítání a násobení s plovoucí desetinnou čárkou jsou komutativní ( a + b = b + a a a × b = b × a ), nejsou nutně asociativní . To znamená, že ( a + b ) + c se nemusí nutně rovnat a + ( b + c ) . Použití 7místné desítkové aritmetiky:

 a = 1234.567, b = 45.67834, c = 0.0004
 (a + b) + c:
     1234.567   (a)
   +   45.67834 (b)
   ____________
     1280.24534   rounds to   1280.245
    1280.245  (a + b)
   +   0.0004 (c)
   ____________
    1280.2454   rounds to   1280.245  ← (a + b) + c
 a + (b + c):
   45.67834 (b)
 +  0.0004  (c)
 ____________
   45.67874
   1234.567   (a)
 +   45.67874   (b + c)
 ____________
   1280.24574   rounds to   1280.246 ← a + (b + c)

Nejsou také nutně distribuční . To znamená, že ( a + b ) × c nemusí být stejné jako a × c + b × c :

 1234.567 × 3.333333 = 4115.223
 1.234567 × 3.333333 = 4.115223
                       4115.223 + 4.115223 = 4119.338
 but
 1234.567 + 1.234567 = 1235.802
                       1235.802 × 3.333333 = 4119.340

Kromě ztráty významnosti, neschopnosti přesně reprezentovat čísla jako π a 0,1 a dalších drobných nepřesností mohou nastat následující jevy:

  • Zrušení : odečtení téměř stejných operandů může způsobit extrémní ztrátu přesnosti. Když odečteme dvě téměř stejná čísla, nastavíme nejvýznamnější číslice na nulu, takže zůstanou jen ty nepatrné a nejsprávnější číslice. Například při určování derivace funkce se používá následující vzorec:

    Intuitivně by člověk chtěl h velmi blízko nule; při použití operací s plovoucí desetinnou čárkou však nejmenší číslo neposkytne nejlepší aproximaci derivátu. Jak se h zmenšuje, rozdíl mezi f ( a + h ) a f ( a ) se zmenšuje, ruší nejvýznamnější a nejméně chybné číslice a dělá ty chybnější číslice důležitější. Výsledkem je, že nejmenší možný počet h poskytne chybnější aproximaci derivace než poněkud větší číslo. Toto je možná nejběžnější a nejzávažnější problém s přesností.
  • Převody na celá čísla nejsou intuitivní: převodem (63,0/9,0) na celé číslo se získá 7, ale převod (0,63/0,09) může přinést 6. Důvodem je, že převody obecně zkracují, nikoli zaokrouhlují. Podlahové a stropní funkce mohou produkovat odpovědi, které jsou od intuitivně očekávané hodnoty odděleny.
  • Omezený rozsah exponentů: výsledky mohou přetékat, čímž se získá nekonečno, nebo podtečení, čímž se získá subnormální číslo nebo nula. V těchto případech dojde ke ztrátě přesnosti.
  • Testování bezpečného dělení je problematické: Kontrola, zda dělitel není nula, nezaručuje, že divize nepřeteče.
  • Testování rovnosti je problematické. Dvě výpočetní sekvence, které jsou matematicky stejné, mohou dobře vytvářet různé hodnoty s plovoucí desetinnou čárkou.

Incidenty

Přesnost stroje a zpětná analýza chyb

Přesnost stroje je veličina, která charakterizuje přesnost systému s plovoucí desetinnou čárkou, a používá se při zpětné analýze chyb algoritmů s plovoucí desetinnou čárkou. To je také známé jako jednotka zaokrouhlení nebo stroj epsilon . Obvykle se označuje Ε mach , jeho hodnota závisí na konkrétním použitém zaokrouhlení.

Se zaokrouhlením na nulu,

zatímco zaokrouhlení na nejbližší,

To je důležité, protože ohraničuje relativní chybu při reprezentaci libovolného nenulového reálného čísla x v normalizovaném rozsahu systému s plovoucí desetinnou čárkou:

Zpětnou chybovou analýzu, jejíž teorii vytvořil a propagoval James H. Wilkinson , lze použít k prokázání, že algoritmus implementující numerickou funkci je numericky stabilní. Základním přístupem je ukázat, že ačkoli vypočítaný výsledek kvůli chybám zaokrouhlení nebude přesně správný, je přesným řešením blízkého problému s mírně narušenými vstupními daty. Pokud je požadovaná odchylka malá, v pořadí nejistoty ve vstupních datech, pak jsou výsledky v jistém smyslu stejně přesné, jako si data „zaslouží“. Algoritmus je pak definován jako zpětně stabilní . Stabilita je měřítkem citlivosti na chyby zaokrouhlení daného numerického postupu; naproti tomu číslo podmínky funkce pro daný problém indikuje inherentní citlivost funkce na malé poruchy v jejím vstupu a je nezávislé na implementaci použité k vyřešení problému.

Jako triviální příklad uvažujme jednoduchý výraz udávající vnitřní součin vektorů (délka dva) a pak

a tak

kde

kde

podle definice, což je součet dvou mírně narušených (řádově Ε mach ) vstupních dat, a je tedy zpětně stabilní. Realističtější příklady v numerické lineární algebře najdete v Higham 2002 a dalších referencích níže.

Minimalizace vlivu problémů s přesností

Ačkoli, jak již bylo uvedeno výše, jednotlivé aritmetické operace IEEE 754 jsou zaručeny s přesností do poloviny ULP, komplikovanější vzorce mohou kvůli zaokrouhlování trpět většími chybami. Ztráta přesnosti může být značná, pokud je problém nebo jeho data špatně podmíněna , což znamená, že správný výsledek je přecitlivělý na drobné odchylky v datech. Avšak i funkce, které jsou dobře podmíněné, mohou trpět velkou ztrátou přesnosti, pokud je použit algoritmus numericky nestabilní pro tato data: zjevně ekvivalentní formulace výrazů v programovacím jazyce se mohou výrazně lišit v jejich numerické stabilitě. Jedním z přístupů k odstranění rizika takové ztráty přesnosti je návrh a analýza numericky stabilních algoritmů, což je cílem oboru matematiky známého jako numerická analýza . Dalším přístupem, který může chránit před rizikem numerických nestabilit, je výpočet mezilehlých (škrábanců) hodnot v algoritmu s vyšší přesností, než vyžaduje konečný výsledek, který může takové riziko odstranit nebo snížit o řádově: čtyřnásobek IEEE 754 Přesnost a rozšířená přesnost jsou pro tento účel navrženy při výpočtu s dvojitou přesností.

Následující algoritmus je například přímou implementací pro výpočet funkce A ( x ) = ( x −1) / (exp ( x −1)-1), která je dobře upravena na 1,0, ale může být ukázána jako numericky nestabilní a při výpočtu blízko 1,0 ztratí až polovinu významných číslic přenášených aritmetikou.

double A(double X)
{
        double Y, Z;  // [1]
        Y = X - 1.0;
        Z = exp(Y);
        if (Z != 1.0)
                Z = Y / (Z - 1.0); // [2]
        return Z;
}

Pokud jsou však všechny mezilehlé výpočty prováděny s prodlouženou přesností (např. Nastavením řádku [1] až C99 long double ), pak lze zachovat až do úplné přesnosti konečného dvojitého výsledku. Alternativně numerická analýza algoritmu odhalí, že pokud dojde k následující nezjevné změně na řádku [2]:

Z = log(Z) / (Z - 1.0);

pak se algoritmus stane numericky stabilní a může počítat s plnou dvojitou přesností.

Aby byly zachovány vlastnosti takto pečlivě sestavených numericky stabilních programů, je nutné pečlivé zacházení kompilátorem . Určité „optimalizace“, které mohou kompilátory provádět (například změny pořadí operací), mohou fungovat proti cílům dobře vychovaného softwaru. V této oblasti existuje určitá kontroverze ohledně nedostatků překladačů a jazykových návrhů: C99 je příkladem jazyka, kde jsou takové optimalizace pečlivě specifikovány, aby byla zachována numerická přesnost. Podívejte se na externí odkazy v dolní části tohoto článku.

Podrobné zpracování technik pro psaní vysoce kvalitního softwaru s plovoucí desetinnou čárkou přesahuje rámec tohoto článku a čtenář je na něj odkazován a ostatní odkazy v dolní části tohoto článku. Kahan navrhuje několik pravidel, která mohou o řád řádově snížit riziko numerických anomálií, kromě nebo místo pečlivější numerické analýzy. Patří sem: jak je uvedeno výše, výpočet všech výrazů a mezivýsledků s nejvyšší přesností podporovanou hardwarem (běžným pravidlem je nést dvojnásobnou přesnost požadovaného výsledku, tj. Pro konečný výsledek s jednou přesností vypočítat s dvojitou přesností, nebo s dvojnásobně rozšířenou nebo čtyřnásobnou přesností pro výsledky až s dvojnásobnou přesností); a zaokrouhlování vstupních dat a výsledků pouze na přesnost požadovanou a podporovanou vstupními daty (přenášení nadměrné přesnosti v konečném výsledku nad rámec požadované a podporované vstupními daty může být zavádějící, zvyšuje náklady na úložiště a snižuje rychlost a přebytečné bity mohou ovlivnit konvergenci numerických postupů: zejména první forma níže uvedeného iteračního příkladu správně konverguje při použití tohoto pravidla). Následuje stručný popis několika dalších problémů a technik.

Protože desetinné zlomky často nelze přesně vyjádřit v binárních plovoucí desetinných čárkách, je taková aritmetika nejlepší, když se jednoduše používá k měření veličin v reálném světě v široké škále měřítek (jako je oběžná doba měsíce kolem Saturnu nebo hmotnost protonu ) a v nejhorším případě, když se očekává modelování interakcí veličin vyjádřených jako desetinné řetězce, od nichž se očekává, že budou přesné. Příkladem posledně uvedeného případu jsou finanční výpočty. Z tohoto důvodu finanční software obvykle nepoužívá binární reprezentaci čísel s plovoucí desetinnou čárkou. Datový typ „desítkové“ programovacích jazyků C# a Python a desítkové formáty standardu IEEE 754-2008 jsou navrženy tak, aby se předešlo problémům s binárními reprezentacemi s plovoucí desetinnou čárkou při aplikaci na přesné desítkové hodnoty zadané člověkem a aby aritmetika se při tisku čísel v desítkové soustavě chová vždy podle očekávání.

V oblasti výpočtu s plovoucí desetinnou čárkou nemusí být splněna očekávání z matematiky. Například je známo, že a že na tyto skutečnosti se však nelze spoléhat, pokud jsou příslušné veličiny výsledkem výpočtu s plovoucí desetinnou čárkou.

Použití testu rovnosti ( if (x==y) ...) vyžaduje opatrnost při práci s čísly s plovoucí desetinnou čárkou. I jednoduché výrazy jako 0.6/0.2-3==0vůle na většině počítačů nemusí být pravdivé (například v IEEE 754 je dvojitá přesnost 0.6/0.2 - 3přibližně -4,44089209850063e -16). V důsledku toho jsou tyto testy někdy nahrazeny „fuzzy“ srovnáváním ( if (abs(x-y) < epsilon) ...kde epsilon je dostatečně malý a přizpůsobený aplikaci, například 1,0E − 13). Moudrost tohoto postupu se velmi liší a může vyžadovat numerickou analýzu vázaného epsilonu. Hodnoty odvozené z primární reprezentace dat a jejich srovnání by měly být prováděny v širší, rozšířenější a přesnější podobě, aby se minimalizovalo riziko takových nesrovnalostí způsobených chybami zaokrouhlení. Často je lepší uspořádat kód tak, aby takové testy nebyly nutné. Například ve výpočetní geometrii lze provést přesné testy, zda bod leží mimo nebo na přímce nebo rovině definované jinými body, pomocí adaptivní přesnosti nebo přesné aritmetické metody.

Malé chyby v aritmetice s pohyblivou řádovou čárkou mohou růst, když matematické algoritmy provádějí operace enormně mnohokrát. Několik příkladů je inverze matice , výpočet vlastních vektorů a řešení diferenciálních rovnic. Pokud mají tyto algoritmy dobře fungovat, musí být velmi pečlivě navrženy s použitím numerických přístupů, jako je iterativní upřesnění .

Součet vektoru hodnot s plovoucí desetinnou čárkou je základním algoritmem ve vědeckých výpočtech , a proto je zásadní uvědomit si, kdy může dojít ke ztrátě významnosti. Pokud například někdo přidává velmi velký počet čísel, jsou jednotlivé sčítání ve srovnání se součtem velmi malé. To může vést ke ztrátě významu. Typickým doplňkem by pak bylo něco jako

3253.671
+  3.141276
-----------
3256.812

Nízké 3 číslice dodatků jsou účinně ztraceny. Předpokládejme například, že je třeba přidat mnoho čísel, všechna přibližně rovná 3. Po přidání 1000 z nich je průběžný součet asi 3000; ztracené číslice se nevrátí. Algoritmus Kahan shrnutí mohou být použity ke snížení chyb.

Chyba zaokrouhlení může ovlivnit konvergenci a přesnost iteračních numerických postupů. Archimedes například přiblížil π výpočtem obvodů mnohoúhelníků, které vepsaly a ohraničily kruh, počínaje šestiúhelníky a postupně zdvojnásobily počet stran. Jak bylo uvedeno výše, výpočty lze přeskupit způsobem, který je matematicky ekvivalentní, ale méně náchylný k chybám ( numerická analýza ). Dvě formy vzorce opakování pro ohraničený polygon jsou:

  • První forma:
  • druhá forma:
  • , konvergující jako

Zde je výpočet pomocí aritmetiky „dvojité“ IEEE (význam s 53 bity přesnosti):

 i   6 × 2i × ti, first form    6 × 2i × ti, second form
---------------------------------------------------------
 0   3.4641016151377543863      3.4641016151377543863
 1   3.2153903091734710173      3.2153903091734723496
 2   3.1596599420974940120      3.1596599420975006733
 3   3.1460862151314012979      3.1460862151314352708
 4   3.1427145996453136334      3.1427145996453689225
 5   3.1418730499801259536      3.1418730499798241950
 6   3.1416627470548084133      3.1416627470568494473
 7   3.1416101765997805905      3.1416101766046906629
 8   3.1415970343230776862      3.1415970343215275928
 9   3.1415937488171150615      3.1415937487713536668
10   3.1415929278733740748      3.1415929273850979885
11   3.1415927256228504127      3.1415927220386148377
12   3.1415926717412858693      3.1415926707019992125
13   3.1415926189011456060      3.1415926578678454728
14   3.1415926717412858693      3.1415926546593073709
15   3.1415919358822321783      3.1415926538571730119
16   3.1415926717412858693      3.1415926536566394222
17   3.1415810075796233302      3.1415926536065061913
18   3.1415926717412858693      3.1415926535939728836
19   3.1414061547378810956      3.1415926535908393901
20   3.1405434924008406305      3.1415926535900560168
21   3.1400068646912273617      3.1415926535898608396
22   3.1349453756585929919      3.1415926535898122118
23   3.1400068646912273617      3.1415926535897995552
24   3.2245152435345525443      3.1415926535897968907
25                              3.1415926535897962246
26                              3.1415926535897962246
27                              3.1415926535897962246
28                              3.1415926535897962246
              The true value is 3.14159265358979323846264338327...

Zatímco dvě formy vzorce opakování jsou jasně matematicky ekvivalentní, první odečte 1 od čísla extrémně blízkého 1, což vede ke stále problematičtější ztrátě významných číslic . Jak se opakování aplikuje opakovaně, přesnost se nejprve zlepší, ale pak se zhorší. Nikdy to nebude lepší než asi 8 číslic, přestože 53bitová aritmetika by měla mít přesnost asi 16 číslic. Když je použita druhá forma opakování, hodnota konverguje k 15 číslicím přesnosti.

„Rychlá matematická“ optimalizace

Výše uvedený nedostatek asociativity operací s plovoucí desetinnou čárkou obecně znamená, že kompilátory nemohou tak efektivně přeskupovat aritmetické výrazy, jako by to bylo možné u celočíselné a pevné aritmetiky, což představuje překážku při optimalizaci, jako je eliminace společné subexprese a automatická vektorizace . Možnost „rychlá matematika“ na mnoha kompilátorech (ICC, GCC, Clang, MSVC ...) zapíná reasociaci spolu s nebezpečnými předpoklady, jako je nedostatek NaN a nekonečné množství v IEEE 754. Některé kompilátory také nabízejí podrobnější možnosti pouze pro zapněte opětovné přidružení. V obou případech je programátor vystaven mnoha přesným nástrahám uvedeným výše pro část programu pomocí „rychlé“ matematiky.

V některých kompilátorech (GCC a Clang) může zapnutí „rychlé“ matematiky způsobit, že program při spuštění deaktivuje podnormální plováky , což ovlivní chování s plovoucí desetinnou čárkou nejen generovaného kódu, ale také jakéhokoli programu používajícího takový kód jako knihovnu .

U většiny kompilátorů Fortran , jak to umožňuje standard Fortran ISO/IEC 1539-1: 2004, je opětovná asociace výchozí, zlomení je do značné míry zabráněno nastavením „chránit pareny“ (také ve výchozím nastavení zapnuto). Toto nastavení zastaví kompilátor před přidružením za hranice závorek. Překladač Intel Fortran je pozoruhodná odchylka.

Častým problémem „rychlé“ matematiky je, že dílčí výrazy nemusí být optimalizovány shodně z místa na místo, což vede k neočekávaným rozdílům. Jedna interpretace problému je, že "rychlá" matematika, jak je implementována, má v současné době špatně definovanou sémantiku. Jeden pokus o formalizaci „rychlé“ matematické optimalizace je vidět v Icingu , ověřeném kompilátoru.

Viz také

Poznámky

Reference

Další čtení

externí odkazy