Unitatea în ultimul loc

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Precizia relativă a reprezentărilor IEEE 754 binary32 și binary64 în virgulă mobilă , comparativ cu o reprezentare zecimală cu un număr fix de cifre semnificative. Precizia relativă este definită ca .

Unitatea în ultimul loc (unitate în ultima poziție) sau unitate de cea mai mică precizie (unitate de cea mai mică precizie), prescurtată în mod obișnuit în ulp , este definită ca valoarea asumată într-un număr în virgulă mobilă cu cifra unității în poziția cea mai puțin semnificativă , [ 1] adică distanța dintre două numere consecutive ale mașinii. Ulp este potrivit ca măsură a erorilor mici în operațiile atomice, în timp ce se pretează mai puțin la exprimarea erorilor în calcule mai mari, deci este utilizat în mod obișnuit pentru a exprima erori în aritmetica computerului, mai rar în analiza numerică . [2]

Definiție

Conceptul de ulp a fost introdus de William Kahan în 1960, iar definiția originală a fost următoarea:

ulp ( x ) este distanța dintre cele două cele mai apropiate numere în virgulă mobilă la x , chiar dacă x este unul dintre ele.

Pentru a lua în considerare introducerea valorilor nenumerice în reprezentare (cum ar fi Inf și NaN ), definiția anterioară a fost extinsă prin impunerea de a lua în considerare doar cele două numere de mașină cele mai apropiate de x și finite și prin setarea ulp ( NaN) = NaN . [3]

O definiție propusă de John Harrison pune ulp ( x ) ca distanță între două mașini consecutive cu virgulă mobilă numerele a și b între care este inclus x (adică axb și ab ), presupunând că intervalul exponentului nu este mărginit deasupra. [4] [5]

Definițiile lui Kahan și Harrison coincid atunci când sunt aplicate numerelor mașinii, dar pot diferi în cazul numerelor reale, pentru valori apropiate de puterile bazei. De exemplu, în baza 2 cu p cifre, dacă 1 <x <1 + 2 -p-1 avem Și . [6]

David Goldberg nu definește ulp ca o funcție, ci ca cantitatea exprimată de cifra unității cel mai puțin semnificativă a numărului mașinii, din care obținem o funcție care la un număr în virgulă mobilă cu p cifre x ∈ [b e , b e + 1 ] potriviți valoarea . [6]

Proprietate

Când se rotunjește un număr într-o reprezentare în virgulă mobilă , valoarea exactă poate diferi până la jumătate din valoarea celei mai puțin semnificative cifre din reprezentarea mașinii, rezultând o eroare absolută limitată la ± 0,5 ulp. Având în vedere un număr din baza b cu p cifre și exponent și , în forma d, d ... d × b e , valoarea numărului variază între b e și b × b e , deci eroarea relativă r asociată cu 0,5 ulp este între

adică

Prin urmare, se observă că eroarea relativă corespunzătoare la 0,5 ulp poate varia cu un factor (numit oscilație ) egal cu b . Când se rotunjește un număr real cu un număr de mașină, eroarea relativă este întotdeauna limitată de limita superioară a intervalului anterior, care este definit ca mașină epsilon . [1]

Standardul IEEE 754 , implementat de practic toate hardware-urile moderne în virgulă mobilă, necesită ca rezultatele operațiilor elementare în virgulă mobilă (adunare, scădere, multiplicare, divizare, modulo și rădăcină pătrată din 1985 și fma din 2008) să fie corect rotunjite, prin urmare cu o eroare limitată la 0,5 ulp. În cazul funcțiilor transcendente, în general, nu este ușor să se determine numărul de cifre necesare în calcul pentru a garanta o rotunjire exactă (o problemă cunoscută sub numele de dilema table-maker ), și nu toate bibliotecile numerice garantează rotunjirea funcțiilor transcendente cu o precizie de 0, 5 ulp, dar de obicei au o precizie de cel puțin 1 ulp. [7]

Suport în limbaje de programare

Cele limbajului C definește în biblioteca standard (header <math.h> ) funcționează pentru a calcula numărul anterior și următor mașină pentru numere în virgulă flotantă: nextafterf și nexttowardf pentru float variabile, nextafter și nexttoward pentru double variabile, nextafterl si nexttowardl pentru long double variabile. [8]

Bibliotecile Boost oferă funcțiile boost::math::float_next , boost::math::float_prior , boost::math::nextafter și boost::math::float_advance pentru a determina numerele anterioare și următoare cu virgulă mobilă și pentru a boost::math::float_distance(a, b) pentru a calcula distanța dintre două numere în virgulă mobilă. [9]

În Ada , numerele mașinii care preced imediat și care urmează o valoare în virgulă mobilă pot fi obținute cu atributele 'Pred și 'Succ , de exemplu pentru o variabilă X de tip Float aceste valori sunt date de Float'Pred(X) și Float'Succ(X) . [10]

Biblioteca standard Java include din versiunea 1.5 funcțiile Math.ulp(double) și Math.ulp(float) , care vă permit să calculați direct valoarea ulp a unei variabile.

Notă

  1. ^ a b Goldberg , p. 8 .
  2. ^ Muller , p. 1 .
  3. ^ Muller , pp. 1-2 .
  4. ^ Harrison , p. 118.
  5. ^ Muller , pp. 3-4 .
  6. ^ a b Muller , p. 4 .
  7. ^ William Kahan, A Logarithm Too Clever by Half ( TXT ), cs.berkeley.edu , 9 august 2004 ( arhivat 27 iulie 2015) .
  8. ^ §7.12.11.3 Funcțiile nextafter , §7.12.11.4 Funcțiile următoare ( PDF ), în specificațiile ISO / IEC 9899: 1999 , p. 237.
  9. ^ Boost float_distance , la boost.org .
  10. ^ John Barnes, Programare în Ada 2012 , Cambridge University Press, 2014, p. 94, ISBN 978-1-107-42481-4 .

Bibliografie

  • David Goldberg, Ce ar trebui să știe fiecare informatician despre aritmetica în virgulă mobilă , în ACM Computing Surveys , martie 1991.
  • John Harrison, A Machine-Checked Theory of Floating Point Arithmetic , în Proceedings of the 1999 International Conference on Theorem Doveding in Higher Order Logics , Nice, Springer, 1999, pp. 113-130.
  • Jean-Michel Muller, Despre definiția ulp (x) , în Raportul tehnic INRIA 5504. ACM Transactions on Mathematical Software , V, N, noiembrie 2005.

Elemente conexe