Jednotka na posledním místě - Unit in the last place
![]() | tento článek potřebuje další citace pro ověření.Březen 2015) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v počítačová věda a numerická analýza, jednotka na posledním místě nebo jednotka s nejmenší přesností (ULP) je mezera mezi dvěma po sobě jdoucími plovoucí bod čísla, tj. hodnota nejméně významná číslice (číslice zcela vpravo) představuje, pokud je 1. Používá se jako míra přesnost v numerických výpočtech.[1]
Definice
Jedna definice je: In základ b s přesností str, pokud bE ≤ |X| < bE+1, pak ULP (X) = bmax (E,Emin)−str+1.[2]
Další definice, kterou navrhl John Harrison, se mírně liší: ULP (X) je vzdálenost mezi dvěma nejbližšími obkročmo čísla s plovoucí desetinnou čárkou A a b (tj. ti s A ≤ X ≤ b a A ≠ b), za předpokladu, že rozsah exponentů není horní hranice.[3][4] Tyto definice se liší pouze při podepsaných silách radixu.[2]
The IEEE 754 specifikace - následovaná veškerým moderním hardwarem s plovoucí desetinnou čárkou - vyžaduje, aby výsledek základní aritmetika operace (sčítání, odčítání, násobení, dělení a odmocnina od roku 1985 a FMA od roku 2008) správně zaoblené, což znamená, že při zaokrouhlování na nejbližší je výsledek zaokrouhleno do 0,5 ULP od matematicky přesného výsledku podle definice Johna Harrisona; naopak tato vlastnost naznačuje, že vzdálenost mezi zaokrouhleným výsledkem a matematicky přesným výsledkem je minimalizována (ale u případů na půli cesty je uspokojena dvěma po sobě jdoucími čísly s plovoucí desetinnou čárkou). Seriózní číselný knihovny spočítat základní transcendentální funkce mezi 0,5 a přibližně 1 ULP. Pouze několik knihoven je počítá do 0,5 ULP, tento problém je složitý kvůli Dilema stolního stolu.[5]
Příklady
Příklad 1
Nechat X být kladné číslo s plovoucí desetinnou čárkou a předpokládat, že aktivní atribut zaokrouhlování je zaokrouhlit na nejbližší, vazby na sudé, označeno RN. Pokud ULP (X) je tedy menší nebo roven 1 RN (X + 1) > X. V opačném případě, RN (X + 1) = X nebo RN (X + 1) = X + ULP (X), v závislosti na hodnotě nejméně významné číslice a exponentu X. To je demonstrováno v následujícím Haskell kód zadaný na interaktivní výzvu:[Citace je zapotřebí ]
> dokud (\X -> X == X+1) (+1) 0 :: Plovák1.6777216e7> to-11.6777215e7> to+11.6777216e7
Tady začínáme od 0 palců jediná přesnost a opakovaně přidávejte 1, dokud operace nezmění hodnotu. Protože významně pro jedno přesné číslo obsahuje 24 bitů, první celé číslo, které není přesně reprezentovatelné, je 224+1 a tato hodnota se zaokrouhlí na 224 v kole k nejbližšímu, vazby na sudé. Výsledek se tedy rovná 224.
Příklad 2
Následující příklad v Jáva přibližný π jako hodnotu s plovoucí desetinnou čárkou vyhledáním bracketingu dvou dvojitých hodnot π:
- str0 <π < str1
// π s 20 desetinnými místyBigDecimal π = Nový BigDecimal("3.14159265358979323846");// zkrácení na dvojitou plovoucí desetinnou čárkoudvojnásobek p0 = π.doubleValue();// -> 3.141592653589793 (hex: 0x1.921fb54442d18p1)// p0 je menší než π, takže najděte další číslo reprezentovatelné jako dvojitédvojnásobek p1 = Matematika.další(p0);// -> 3.1415926535897936 (hex: 0x1.921fb54442d19p1)
Pak ULP (π) je určen jako
- ULP (π) = str1 - str0
// ulp (π) je rozdíl mezi p1 a p0BigDecimal ulp = Nový BigDecimal(p1).odčítat(Nový BigDecimal(p0));// -> 4.44089209850062616169452667236328125E-16// (to je přesně 2 ** (- 51))// stejný výsledek při použití standardní funkce knihovnydvojnásobek ulpMath = Matematika.ulp(p0);// -> 4.440892098500626E-16 (hex: 0x1.0p-51)
Příklad 3
Další příklad v Krajta, také napsané na interaktivní výzvu, je:[Citace je zapotřebí ]
>>> X = 1.0>>> str = 0>>> zatímco X != X + 1:... X = X * 2... str = str + 1... >>> X9007199254740992.0>>> str53>>> X + 2 + 19007199254740996.0
V tomto případě začneme s X = 1 a opakovaně to zdvojnásobujte, dokud X = X + 1. Podobně jako v příkladu 1 je výsledek 253 protože dvojnásobná přesnost formát s plovoucí desetinnou čárkou používá 53-bitový význam.
Jazyková podpora
The Zvyšte knihovny C ++ poskytuje funkce boost :: math :: float_next
, podpora :: matematika :: float_prior
, boost :: math :: nextafter
a boost :: math :: float_advance
získat blízké (a vzdálené) hodnoty s plovoucí desetinnou čárkou,[6] a podpora :: matematika :: float_distance (a, b)
k výpočtu vzdálenosti s plovoucí desetinnou čárkou mezi dvěma zdvojnásobení.[7]
The Jazyk C. knihovna poskytuje funkce pro výpočet dalšího čísla s plovoucí desetinnou čárkou v daném směru: nextafterf
a další
pro plovák
, další
a další
pro dvojnásobek
, nextafterl
a další
pro dlouhý dvojitý
, deklarováno v <math.h>
. Poskytuje také makra FLT_EPSILON
, DBL_EPSILON
, LDBL_EPSILON
, které představují kladný rozdíl mezi 1,0 a dalším vyšším reprezentovatelným číslem v odpovídajícím typu (tj. ULP jednoho).[8]
The Jáva funkce poskytuje standardní knihovna Math.ulp (double)
a Math.ulp (float)
. Byly představeny s Java 1.5.
The Rychlý standardní knihovna poskytuje přístup k dalšímu číslu s plovoucí desetinnou čárkou v určitém směru prostřednictvím vlastností instance nextDown
a další
. Poskytuje také vlastnost instance ulp
a vlastnost typu ulpOfOne
(což odpovídá C makrům jako FLT_EPSILON
[9]) pro typy Swift s plovoucí desetinnou čárkou.[10]
Viz také
- IEEE 754
- ISO / IEC 10967, část 1 vyžaduje funkci ulp
- Nejméně významný bit (LSB)
- Stroj epsilon
Reference
- ^ David Goldberg: Co by měl každý počítačový vědec vědět o aritmetice s plovoucí desetinnou čárkou, oddíl 1.2 Relativní chyba a ulpy, ACM Computing Surveys, svazek 23, č. 1, s. 8, březen 1991.
- ^ A b Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Torres, Serge (2018) [2010]. Příručka aritmetiky s plovoucí desetinnou čárkou (2. vyd.). Birkhäuser. doi:10.1007/978-3-319-76526-6. ISBN 978-3-319-76525-9.
- ^ Harrison, John. „Teorie strojově kontrolované aritmetiky s plovoucí desetinnou čárkou“. Citováno 17. července 2013.
- ^ Muller, Jean-Michel (2005-11). "K definici ulp (x)". INRIA Technická zpráva 5504. Transakce ACM na Mathematical Software, sv. V, č. N, listopad 2005. Citováno v letech 2012-03 z http://ljk.imag.fr/membres/Carine.Lucas/TPScilab/JMMuller/ulp-toms.pdf.
- ^ Kahan, William. „Logaritmus příliš chytrý na polovinu“. Citováno 14. listopadu 2008.
- ^ Zvyšte float_advance.
- ^ Zvyšte float_distance.
- ^ Specifikace ISO / IEC 9899: 1999 (PDF). p. 237, §7.12.11.3 Další funkce a §7.12.11.4 Další funkce.
- ^ "ulpOfOne - FloatingPoint | Dokumentace pro vývojáře Apple". Apple Inc.. Apple Inc.. Citováno 18. srpna 2019.
- ^ „FloatingPoint - standardní knihovna Swift | Dokumentace vývojáře Apple“. Apple Inc.. Apple Inc.. Citováno 18. srpna 2019.
Bibliografie
- Goldberg, David (1991-03). „Chyba zaokrouhlování“ v „Co by měl každý počítačový vědec vědět o aritmetice s plovoucí desetinnou čárkou“. Computing Surveys, ACM, březen 1991. Citováno z http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#689.
- Muller, Jean-Michel (2010). Příručka aritmetiky s plovoucí desetinnou čárkou. Boston: Birkhäuser. s. 32–37. ISBN 978-0-8176-4704-9.