math_error(7) Miscellaneous Information Manual math_error(7) NUME math_error - detecteaza erorile din funciile matematice SINOPSIS #include #include #include DESCRIERE Atunci cand apare o eroare, majoritatea funciilor de biblioteca indica acest fapt prin returnarea unei valori speciale (de exemplu, -1 sau NULL). Deoarece in mod obinuit returneaza un numar in virgula mobila, funciile matematice declarate in indica o eroare folosind alte mecanisme. Exista doua mecanisme de semnalizare a erorilor: cel mai vechi definete errno; cel mai nou utilizeaza mecanismul de excepie in virgula mobila (utilizarea lui feclearexcept(3) i fetestexcept(3), aa cum este prezentat mai jos) descris in fenv(3). Un program portabil care trebuie sa verifice o eroare dintr-o funcie matematica ar trebui sa stabileasca errno la zero i sa faca urmatorul apel feclearexcept(FE_ALL_EXCEPT); inainte de a apela o funcie matematica. La revenirea din funcia matematica, daca errno este diferita de zero, sau daca apelul urmator (a se vedea fenv(3)) returneaza un rezultat diferit de zero, fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); atunci s-a produs o eroare in funcia matematica. Condiiile de eroare care pot aparea pentru funciile matematice sunt descrise mai jos. Eroare de domeniu O eroare de domeniu apare atunci cand o funcie matematica este furnizata cu un argument a carui valoare se afla in afara domeniului pentru care este definita funcia (de exemplu, dand un argument negativ lui log(3)). Atunci cand apare o eroare de domeniu, funciile matematice returneaza in mod obinuit un NaN (dei unele funcii returneaza o valoare diferita in acest caz); errno este stabilita la EDOM i se genereaza o excepie ,,nevalida" (FE_INVALID) in virgula mobila. Eroare de pol (semn) O eroare de pol apare atunci cand rezultatul matematic al unei funcii este un infinit exact (de exemplu, logaritmul lui 0 este un infinit negativ). Atunci cand apare o eroare de pol, funcia returneaza valoarea (cu semn) HUGE_VAL, HUGE_VALF sau HUGE_VALL, in funcie de tipul rezultatului funciei: double, float sau long double. Semnul rezultatului este cel care este corect din punct de vedere matematic pentru funcia respectiva. errno este stabilita la ERANGE i se genereaza o excepie de ,,imparire la zero" (FE_DIVBYZERO) in virgula mobila. Eroare de interval O eroare de interval apare atunci cand magnitudinea rezultatului funciei inseamna ca acesta nu poate fi reprezentat in tipul de rezultat al funciei. Valoarea de returnare a funciei depinde de faptul daca eroarea de interval a fost o depaire a limitei maxime sau o depaire a limitei minime. Un rezultat flotant de depaire a limitei maxime daca rezultatul este finit, dar este prea mare pentru a fi reprezentat in tipul de rezultat. Atunci cand se produce o depaire, funcia returneaza valoarea HUGE_VAL, HUGE_VALF sau HUGE_VALL, in funcie de faptul ca tipul rezultatului funciei este double, float sau long double. errno este stabilita la ERANGE i se genereaza o excepie de ,,depaire a limitei maxime" (FE_OVERFLOW) in virgula mobila. Un rezultat flotant de depaire a limitei minime daca rezultatul este prea mic pentru a fi reprezentat in tipul de rezultat. In cazul in care se produce o depaire a limitei minime, o funcie matematica returneaza de obicei 0,0 (C99 spune ca o funcie trebuie sa returneze ,,o valoare definita de implementare a carei marime nu este mai mare decat cel mai mic numar pozitiv normalizat in tipul specificat"). errno poate fi stabilita la ERANGE i poate fi generata o excepie ,,depaire a limitei minime" (FE_UNDERFLOW) in virgula mobila. Unele funcii genereaza o eroare de interval in cazul in care valoarea argumentului furnizat sau rezultatul corect al funciei ar fi subnormal. O valoare subnormala este o valoare diferita de zero, dar cu o magnitudine atat de mica incat nu poate fi prezentata in forma normalizata (adica cu un 1 in cel mai semnificativ bit al semnificantului). Reprezentarea unui numar subnormal va conine unul sau mai multe zerouri la inceput in semnificaie. NOTE Identificatorul math_errhandling specificat de C99 i POSIX.1 nu este acceptat de glibc. Acest identificator ar trebui sa indice care dintre cele doua mecanisme de notificare a erorilor (errno, excepii recuperabile prin fetestexcept(3)) este utilizat. Standardele impun ca cel puin unul dintre ele sa fie utilizat, dar permit ca ambele sa fie disponibile. Situaia actuala (glibc 2.8) in cadrul glibc este dezordonata. Majoritatea funciilor (dar nu toate) ridica excepii in caz de eroare. Unele stabilesc, de asemenea, errno. Cateva funcii configureaza errno, dar nu genereaza o excepie. Foarte puine funcii nu fac nici una, nici alta. Consultai paginile de manual individuale pentru detalii. Pentru a evita complexitatea utilizarii errno i fetestexcept(3) pentru verificarea erorilor, se recomanda adesea sa se verifice daca exista valori de argument greite inainte de fiecare apel. De exemplu, codul urmator se asigura ca argumentul lui log(3) nu este un NaN i nu este zero (o eroare de pol) sau mai mic decat zero (o eroare de domeniu): double x, r; if (isnan(x) || islessequal(x, 0)) { /* Rezolva problemele cu NaN / eroare de pol / eroare de domeniu */ } r = log(x); Discuia de pe aceasta pagina nu se aplica funciilor matematice complexe (de exemplu, cele declarate de ), care, in general, nu sunt obligate sa returneze erori prin C99 i POSIX.1. Opiunea gcc(1) -fno-math-errno face ca executabilul sa utilizeze implementari ale unor funcii matematice care sunt mai rapide decat implementarile standard, dar nu configureaza errno in caz de eroare; (opiunea gcc(1) -ffast-math activeaza, de asemenea, -fno-math-errno). O eroare poate fi in continuare testata folosind fetestexcept(3). CONSULTAI I gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3) info libc TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.8 2 mai 2024 math_error(7)