Jednotka na posledním místě - Unit in the last place
Ve výpočetní technice a numerické analýze je jednotka na posledním místě nebo jednotka nejmenší přesnosti ( ulp ) mezera mezi dvěma po sobě jdoucími čísly s plovoucí desetinnou čárkou , tj. Hodnota, kterou představuje nejméně významná číslice (číslice zcela vpravo), pokud je 1. Je se používá jako měřítko přesnosti v numerických výpočtech.
Definice
Jedna definice zní: V radixu s přesností , pokud , pak .
Další definice, navržená Johnem Harrisonem, se mírně liší: je vzdálenost mezi dvěma nejbližšími obkročnými čísly s plovoucí desetinnou čárkou a (tj. Těmi s a ), za předpokladu, že rozsah exponentů není horní. Tyto definice se liší pouze při podepsaných mocnostech radixu.
Specifikace IEEE 754 -následovaná veškerým moderním hardwarem s plovoucí desetinnou čárkou-vyžaduje, aby výsledek elementární aritmetické operace (sčítání, odčítání, násobení, dělení a odmocnina od roku 1985 a FMA od roku 2008) byl správně zaokrouhlen , což znamená, že při zaokrouhlení na nejbližší je zaokrouhlený výsledek do 0,5 ulp matematicky přesného výsledku podle definice Johna Harrisona; naopak tato vlastnost znamená, že vzdálenost mezi zaokrouhleným výsledkem a matematicky přesným výsledkem je minimalizována (ale pro poloviční případy je splněna dvěma po sobě jdoucími čísly s plovoucí desetinnou čárkou). Renomované numerické knihovny počítají základní transcendentální funkce mezi 0,5 a přibližně 1 ulp. Pouze několik knihoven je vypočítá do 0,5 ulp, tento problém je složitý kvůli dilematu tvůrce tabulky .
Příklady
Příklad 1
Nechť je kladné číslo s plovoucí desetinnou čárkou a předpokládejme, že aktivní režim zaokrouhlení je zaokrouhlený na nejbližší, vázaný na sudý , označený . Pokud , tak . Jinak, nebo , v závislosti na hodnotě nejméně významné číslice a exponentu . To je ukázáno v následujícím kódu Haskell zadaném v interaktivní výzvě:
> until (\x -> x == x+1) (+1) 0 :: Float
1.6777216e7
> it-1
1.6777215e7
> it+1
1.6777216e7
Zde začínáme 0 s jednoduchou přesností a opakovaně přidáváme 1, dokud operace nezmění hodnotu. Vzhledem k tomu, mantisy pro jednoduchou přesností číslo obsahuje 24 bitů, přičemž první celé číslo, které není přesně reprezentovat je 2 24 1 a tato hodnota se zaokrouhlí na 2 24 v kole s nejbližší, vazby na i. Výsledek se tedy rovná 2 24 .
Příklad 2
V následujícím příkladu je v Javě blíží π jako plovoucí bodové hodnoty tím, že najde dvě dvojné hodnoty bracketing : .
// π with 20 decimal digits
BigDecimal π = new BigDecimal("3.14159265358979323846");
// truncate to a double floating point
double p0 = π.doubleValue();
// -> 3.141592653589793 (hex: 0x1.921fb54442d18p1)
// p0 is smaller than π, so find next number representable as double
double p1 = Math.nextUp(p0);
// -> 3.1415926535897936 (hex: 0x1.921fb54442d19p1)
Poté se určí jako .
// ulp(π) is the difference between p1 and p0
BigDecimal ulp = new BigDecimal(p1).subtract(new BigDecimal(p0));
// -> 4.44089209850062616169452667236328125E-16
// (this is precisely 2**(-51))
// same result when using the standard library function
double ulpMath = Math.ulp(p0);
// -> 4.440892098500626E-16 (hex: 0x1.0p-51)
Příklad 3
Další příklad v Pythonu , také zadaný na interaktivní výzvě, je:
>>> x = 1.0
>>> p = 0
>>> while x != x + 1:
... x = x * 2
... p = p + 1
...
>>> x
9007199254740992.0
>>> p
53
>>> x + 2 + 1
9007199254740996.0
V tomto případě začínáme na x = 1
a opakovaně zdvojnásobujeme, dokud x = x + 1
. Podobně jako v příkladu 1 je výsledkem 2 53, protože formát s plovoucí desetinnou čárkou s dvojitou přesností používá 53bitový význam.
Jazyková podpora
Zesílení C ++ knihovny poskytuje funkce boost::math::float_next
, boost::math::float_prior
, boost::math::nextafter
a boost::math::float_advance
získat v blízkosti (a vzdálený) hodnoty s plovoucí desetinnou čárkou, a boost::math::float_distance(a, b)
pro výpočet vzdálenosti s plovoucí desetinnou čárkou mezi dvěma zdvojnásobí.
Jazyk C knihovna poskytuje funkce pro výpočet další číslo s plovoucí desetinnou čárkou v nějakém daném směru: nextafterf
a nexttowardf
na float
, nextafter
a nexttoward
na double
, nextafterl
a nexttowardl
pro long double
, prohlásil v <math.h>
. To také poskytuje makra FLT_EPSILON
, DBL_EPSILON
, LDBL_EPSILON
, které představují pozitivní rozdíl mezi 1,0 a další větší reprezentovatelný číslem v odpovídajícím typu (tj ULP jednoho).
Java standardní knihovna poskytuje funkce Math.ulp(double)
a Math.ulp(float)
. Byly představeny s jazykem Java 1.5.
Swift standardní knihovna poskytuje přístup k dalším číslem s plovoucí čárkou v nějakém daném směru přes vlastnosti instance nextDown
a nextUp
. Poskytuje také vlastnost instance ulp
a vlastnost type ulpOfOne
(která odpovídá makrům typu C FLT_EPSILON
) pro typy Swift s plovoucí desetinnou čárkou.
Viz také
- IEEE 754
- ISO/IEC 10967 , část 1 vyžaduje funkci ulp
- Nejméně významný bit (LSB)
- Strojní epsilon
Reference
Bibliografie
- Goldberg, David (1991–03). „Chyba zaokrouhlení“ 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. Získá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.