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 = 1a 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_advancezí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: nextafterfa nexttowardfna float, nextaftera nexttowardna double, nextafterla nexttowardlpro 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 nextDowna nextUp. Poskytuje také vlastnost instance ulpa vlastnost type ulpOfOne(která odpovídá makrům typu C FLT_EPSILON) pro typy Swift s plovoucí desetinnou čárkou.

Viz také

Reference

Bibliografie