Epsilonul mașinii sau precizia mașinii este o limită superioară a erorii de aproximare relative datorată rotunjirii în sistemele de numere în virgulă mobilă. Această valoare caracterizează aritmetica calculatoarelor în domeniul analizei numerice și, prin extensie, în domeniul informaticii. Cantitatea este notată cu (epsilon).
Există două definiții predominante, notate aici ca epsilonul mașinii ca rotunjire sau definiția formală și epsilonul mașinii ca interval sau definiția mainstream.
În definiția mainstream, epsilonul mașinii este independent de metoda de rotunjire și este definit simplu ca diferența dintre 1 și următorul număr în virgulă mobilă, mai mare.
În definiția formală, epsilonul mașinii depinde de tipul de rotunjire utilizat și se numește și rotunjirea unității, care are simbolul roman îngroșat u.
În general, se poate considera că cele două definiții diferă doar cu un factor de doi, prin definiția formală rezultând un epsilon de jumătate din dimensiunea definiției mainstream, așa cum este rezumat în tabelul din secțiunea următoare.
Valori pentru aritmetica folosită de un hardware standard Următorul tabel listează valorile epsilon ale mașinii pentru formatele standard în virgulă mobilă. IEEE 754-2008 Nume comun Tip de datăîn C++ Baza Precizia Epsilonul mașiniila rotunjire Epsilonul mașiniica interval binary16semiprecizie211 (un bit este implicit)2−11 ≈ 4,88e-042−10 ≈ 9,77e-04 binary32precizie simplă 224 (un bit este implicit)2−24 ≈ 5,96e-082−23 ≈ 1,19e-07binary64precizie dublă253 (un bit este implicit)2−53 ≈ 1,11e-162−52 ≈ 2,22e-16 precizie extinsă Floating Types - Using the GNU Compiler Collection (GCC)2642−64 ≈ 5.42e-202−63 ≈ 1.08e-19binary128precizie cvadruplă2113 (un bit este implicit)2−113 ≈ 9,63e-352−112 ≈ 1,93e-34zecimal în precizie simplă Decimal Float - Using the GNU Compiler Collection (GCC)1075 × 10−710−6]zecimal în precizie dublă10165 × 10−1610−15zecimal în precizie cvadruplă10345 × 10−3410−33
Definiții alternative pentru epsilon Standardul IEEE nu definește termenii „epsilonul mașinii” și „rotunjirea unității”, așadar se utilizează definiții diferite ale acestor termeni, ceea ce poate cauza o oarecare confuzie.
Cei doi termeni diferă doar cu un factor de doi. Termenul mai utilizat pe scară largă (denumit definiția mainstream în acest articol) este utilizat în majoritatea limbajelor de programare moderne și este definit ca epsilonul mașinii este diferența dintre 1 și următorul număr cu virgulă mobilă mai mare. Definiția formală poate fi considerată, în general, ca rezultând un epsilon cu dimensiunea jumătate din cea a definiției mainstream, deși definiția sa variază în funcție de forma de rotunjire utilizată.
Cei doi termeni sunt descriși pe larg în următoarele două subsecțiuni.
Definiția formală Definiția formală pentru epsilonul mașinii este cea folosită de profesorul James Demmel în prelegerile sale, în pachetul de algebră liniară LAPACK, în articole de analiză numerică și în unele software. Majoritatea specialiștilor în analiza numerică folosesc cuvintele epsilonul mașinii și rotunjirea unității interschimbabil, cu acest înțeles, care este descris în detaliu în această subsecțiune.
Rotunjirea este o procedură pentru alegerea reprezentării unui număr real într-un sistem numeric în virgulă mobilă. Pentru un sistem numeric și o procedură de rotunjire, epsilonul mașinii este eroarea relativă maximă a procedurii de rotunjire alese.
Sunt necesare câteva informații generale pentru a determina o valoare conform acestei definiții. Un sistem de numere în virgulă mobilă este caracterizat de o bază, și de precizie, adică numărul de cifre cu baza ale mantisei (inclusiv orice bit ascuns). Toate numerele cu același exponent, , au spațierea Spațierea se schimbă la numerele care sunt puteri perfecte ale lui spațierea de partea cu mărimea mai mare este de ori mai mare decât spațierea de partea cu mărimea mai mică.
Întrucât epsilonul mașinii este o limită pentru eroarea relativă, este suficient să se ia în considerare numere cu exponentul De asemenea, este suficient să se ia în considerare numerele pozitive. Pentru tipul obișnuit de rotunjire la valoarea cea mai apropiată, eroarea absolută de rotunjire este cel mult jumătate din spațiere, sau Această valoare este cel mai mare numărător posibil pentru eroarea relativă. Numitorul din eroarea relativă este numărul rotunjit, care ar trebui să fie cât mai mic posibil pentru a face eroarea relativă mare. Prin urmare, cea mai gravă eroare relativă apare atunci când rotunjirea se aplică numerelor de forma unde este între și Toate aceste numere se rotunjesc la cu eroarea relativă Maximul apare atunci când se află la capătul superior al intervalului său. Valoarea din numitor este nesemnificativă în comparație cu numărătorul, așa că este omisă din motive de comoditate și se ia doar drept epsilonul mașinii. După cum s-a arătat, eroarea relativă este cea mai mare pentru numerele care rotunjesc la , așa că epsilonul mașinii este numit și rotunjirea unității, adică aproximativ „eroarea maximă care poate apărea la rotunjirea la valoarea unității”.
Astfel, distanța maximă dintre un număr în virgulă mobilă normalizat, x, și un număr normalizat adiacent este
Modelul aritmetic Analiza numerică folosește epsilonul mașinii pentru a studia efectele erorii de rotunjire. Erorile reale ale aritmeticii mașinii sunt mult prea complicate pentru a fi studiate direct, așa că, în loc, se utilizează următorul model simplu. Standardul aritmetic IEEE spune că toate operațiile în virgulă mobilă sunt efectuate ca și cum ar fi posibil să se efectueze operația cu precizie infinită, iar apoi rezultatul este rotunjit la un număr în virgulă mobilă. Dacă (1) sunt numere în virgulă mobilă, (2) este o operație aritmetică cum ar fi adunarea sau înmulțirea pe numere în virgulă mobilă, și (3) este operația în precizie infinită, conform standardului computerul calculează:
Conform sensului epsilonului mașinii, mărimea eroarii relative prin rotunjire este cel mult epsilonul mașinii, deci:
unde este o mărime absolută de cel mult sau u. Pentru a vedea cum este utilizat acest model pentru a analiza erorile, să zicem, ale eliminării gaussiene, pot fi consultate cărțile lui Demmel Demmel, James W., Applied Numerical Linear Algebra, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, 1997 și Higham. Higham, Nicholas J.; Accuracy and Stability of Numerical Algorithms, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, second edition, 2002
Definiția mainstream Această definiție alternativă este semnificativ mai răspândită: epsilonul mașinii este diferența dintre 1 și următorul număr mai mare în virgulă mobilă. Această definiție este utilizată în constantele limbajelor Ada, C, C++, Fortran, MATLAB, , Octave, Pascal, Python, Rust etc. și este definită în manuale precum Numerical Recipes.
Conform acestei definiții, ε este egal cu valoarea cifrei din ultima poziție relativ la 1, adică (unde este baza sistemului în virgulă mobilă și este precizia), iar rotunjirea unității este presupunând că rotunjirea se face la valoarea cea mai apropiată, iar presupunând că rotunjirea se face prin trunchiere.
Predominanța acestei definiții se datorează utilizării sale în standardul ISO C pentru constantele în virgulă mobilă și constantele corespunzătoare din alte limbaje de programare. Este utilizat pe scară largă și în software-ul de calcul științific și în literatura de analiză numerică și informatică.
Cum se determină epsilonul mașinii În cazul în care bibliotecile standard nu oferă valori precalculate (cum fac <float.h> prin FLT_EPSILON, DBL_EPSILON și LDBL_EPSILON în C și <limits> prin std::numeric_limits<T>::epsilon() în C++), Cea mai bună metodă de a determina epsilonul mașinii este consultarea tabelului de mai sus și utilizarea formulei puterii corespunzătoare. Calculul epsilonului mașinii este adesea dat ca exercițiu de manual. Următoarele exemple calculează intervalul epsilonului mașinii în sensul spațierii numerelor în virgulă mobilă în vecinătatea lui 1, în loc de rotunjirea unității.
De reținut că rezultatele depind de formatul particular utilizat pentru virgula mobilă, cum ar fi float, double, long double sau similar, așa cum este acceptat de limbajul de programare, compilator și biblioteca de execuție pentru platforma folosită.
Este posibil ca unele formate acceptate de procesor să nu fie acceptate de compilatorul și sistemul de operare ales. Alte formate ar putea fi emulate de biblioteca de execuție, inclusiv disponibilă în anumite limbaje și biblioteci.
În sens strict, termenul „epsilonul mașinii” înseamnă precizia suportată direct de procesor (sau coprocesor), nu o anumită precizie suportată de un compilator specific pentru un anumit sistem de operare, cu excepția cazului în care se știe că acesta utilizează cel mai bun format.
Formatele în virgulă mobilă IEEE 754 au proprietatea ca, atunci când sunt reinterpretate ca un număr întreg în complement față de doi pe același număr de biți, acestea cresc monoton pentru valorile pozitive și scad monoton pentru valorile negative. De asemenea, au proprietatea că și (unde este reinterpretarea întreagă menționată anterior a lui ). În limbajele care permit interpretarea aceleiași reprezentări în diferite formate și utilizează întotdeauna IEEE 754–1985, se poate exploata acest lucru pentru a calcula un epsilon al unei mașini în timp constant. De exemplu, în C: typedef union { long long i64; double d64; } dbl_64;
double machine_eps (double value) { dbl_64 s; s.d64 = value; s.i64++; return s.d64 - value; } Aceasta va da un rezultat cu același semn ca și valoarea. Dacă se dorește întotdeauna un rezultat pozitiv, instrucțiunea return a funcției machine_eps poate fi înlocuită cu: return (s.i64 < 0 ? value - s.d64 : s.d64 - value);
Exemplu în Python: def machineEpsilon(func=float): machine_epsilon = func(1) while func(1) + machine_epsilon != func(1): machine_epsilon_last = machine_epsilon machine_epsilon = func(machine_epsilon) / func(2) return machine_epsilon_last
Precizia dublă (pe 64 biți) va de 2,220446e-16, care este 2−52, conform așteptărilor.
Aproximare Următorul algoritm simplu poate fi utilizat pentru a aproxima epsilonul mașinii, cu o precizie de doi față de valoarea sa reală, folosind o .
epsilon = 1.0;
while (1.0 + 0.5 * epsilon) ≠ 1.0: epsilon = 0.5 * epsilon
Dacă se cunoaște numărul de biți ai mantisei, epsilonul mașinii, poate fi calculat pur și simplu ca doi la puterea negativă a numărului de biți ai mantisei.
Relația cu valoarea erorii absolute Dacă este reprezentarea în mașină a numărului atunci eroarea absolută în reprezentare este
Demonstrație Următoarea demonstrație este limitată la numere pozitive și reprezentări în mașină folosind rotunjirea prin trunchiere.
Dacă este numărul pozitiv care se dorește a fi reprezentat, el va fi între un număr reprezentabil în mașină mai mic decât și un număr în mașină mai mare decât
Dacă unde este numărul de biți folost la reprezentarea mantisei, atunci:
Întrucât reprezentarea lui va fi fie fie ,
Deși această demonstrație este limitată la numere pozitive și rotunjire prin trunchiere, aceeași metodă poate fi utilizată pentru a demonstra inegalitatea pentru numerele negative și reprezentările în mașină rotunjite la valoarea cea mai apropiată
Note
Lectură suplimentară Anderson, E.; LAPACK Users' Guide, Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, third edition, 1999. Cody, William J.; MACHAR: A Soubroutine to Dynamically Determine Machine Parameters, ACM Transactions on Mathematical Software, Vol. 14(4), 1988, 303–311. Besset, Didier H.; Object-Oriented Implementation of Numerical Methods, Morgan & Kaufmann, San Francisco, CA, 2000. Forsythe, George E.; Malcolm, Michael A.; Moler, Cleve B.; "Computer Methods for Mathematical Computations", Prentice-Hall, , 1977
Vezi și Virgulă mobilă
Legături externe