fenv(3) Library Functions Manual fenv(3) NAZWA feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept - zaokraglanie zmiennoprzecinkowe i obsluga wyjatkow BIBLIOTEKA Biblioteka matematyczna (libm, -lm) SKLADNIA #include int feclearexcept(int excepts); int fegetexceptflag(fexcept_t *flagp, int excepts); int feraiseexcept(int excepts); int fesetexceptflag(const fexcept_t *flagp, int excepts); int fetestexcept(int excepts); int fegetround(void); int fesetround(int rounding_mode); int fegetenv(fenv_t *envp); int feholdexcept(fenv_t *envp); int fesetenv(const fenv_t *envp); int feupdateenv(const fenv_t *envp); OPIS Tych jedenascie funkcji zdefiniowanych w C99 realizuje obsluge zmiennoprzecinkowego zaokraglania i wyjatkow (nadmiar, dzielenie przez zero, itp.). Wyjatki Wyjatek divide-by-zero (dzielenie przez zero) wystepuje, gdy dokladnym wynikiem operacji na liczbach skonczonych jest nieskonczonosc. Wyjatek overflow (nadmiar) wystepuje, gdy wynik musi byc przedstawiony jako liczba zmiennoprzecinkowa, ale ma on (duzo) wieksza wartosc bezwzgledna niz najwieksza (skonczona) liczba zmiennoprzecinkowa majaca przedstawienie. Wyjatek underflow (niedomiar) wystepuje, gdy wynik musi byc przedstawiony jako liczba zmiennoprzecinkowa, ale ma mniejsza wartosc bezwzgledna niz najmniejsza dodatnia znormalizowana liczba zmiennoprzecinkowa (i nastapilaby duza utrata precyzji, gdyby przedstawic go jako liczbe nieznormalizowana). Wyjatek inexact (niedokladny) wystepuje, gdy wynik operacji zaokraglenia nie jest rowny wynikowi o nieskonczonej precyzji. Moze on towarzyszyc wystapieniu overflow lub underflow. Wyjatek invalid (nieprawidlowy) wystepuje, gdy operacja nie ma dobrze zdefiniowanego wyniku, przyklady: 0/0, nieskonczonosc - nieskonczonosc lub sqrt(-1). Obsluga wyjatkow Wyjatki sa reprezentowane na dwa sposoby: jako pojedyncze bity (wyjatek obecny/nieobecny), ktore to bity odpowiadaja w pewien zalezny od implementacji sposob pozycjom bitowym w liczbie calkowitej, i jako nieprzezroczysta struktura, ktora moze zawierac wiecej informacji o wyjatkach (zapewne adres kodu, gdzie wyjatek wystapil). Kazde z makr FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW jest zdefiniowane, gdy implementacja wspiera obsluge odpowiedniego wyjatku, i wowczas definiuje odpowiedni(e) bit(y), umozliwiajac wywolywanie funkcji obslugi wyjatkow, na przyklad podajac argument calkowity FE_OVERFLOW|FE_UNDERFLOW. Dla innych wyjatkow moze nie byc wsparcia. Makro FE_ALL_EXCEPT jest bitowym OR wszystkich bitow odpowiadajacym wspieranym wyjatkom. Funkcja feclearexcept() zeruje wspierane wyjatki reprezentowane przez bity jej argumentu. Funkcja fegetexceptflag() umieszcza odwzorowanie stanu znacznikow przypisanych wyjatkom reprezentowanym przez argument excepts w nieprzezroczystym obiekcie *flagp. Funkcja feraiseexcept() zglasza wspierane wyjatki reprezentowane przez bity excepts. Funkcja fesetexceptflag() ustawia pelny stan o wartosci *flagp dla wyjatkow reprezentowanych przez excepts. Wartosc ta musi byc otrzymana jako wynik wczesniejszego wywolania fegetexceptflag() z ostatnim argumentem zawierajacym wszystkie bity excepts. Funkcja fetestexcept() zwraca slowo z ustawionymi tymi bitami, ktore sa ustawione w argumencie excepts i dla ktorych jest obecnie ustawiony odpowiedni wyjatek. Tryb zaokraglania Tryb zaokraglania okresla w jaki sposob traktuje sie wynik operacji zmiennoprzecinkowej, jesli nie moze byc on dokladnie reprezentowany w mantysie. Moga byc dostarczane rozne tryby zaokraglen: zaokraglanie do najblizszej liczby (domyslnie), zaokraglanie w gore (w kierunku dodatniej nieskonczonosci), zaokraglanie w dol (w kierunku ujemnej nieskonczonosci) i zaokraglanie w kierunku zera. Kazde z makr FE_TONEAREST, FE_UPWARD, FE_DOWNWARD oraz FE_TOWARDZERO jest zdefiniowane, gdy implementacja wspiera pobieranie i ustawianie odpowiedniego kierunku zaokraglania. Funkcja fegetround() zwraca makro odpowiadajace biezacemu trybowi zaokraglania. Funkcja fesetround() ustawia tryb zaokraglania podany jako jej argument i zwraca zero, gdy sie powiedzie. C99 i POSIX.1-2008 okreslaja identyfikator FLT_ROUNDS definiowany w wskazujacy na zalezny od implementacji sposob zaokraglania podczas dodawania zmiennoprzecinkowego. Identyfikator ten moze przyjmowac jedna z ponizszych wartosci: -1 Nie mozna okreslic tryb zaokraglania. 0 Zaokraglanie w kierunku 0. 1 Zaokraglanie w kierunku najblizszej liczby. 2 Zaokraglanie w kierunku dodatniej nieskonczonosci. 3 Zaokraglanie w kierunku ujemnej nieskonczonosci. Inne wartosci oznaczaja tryby zaokraglania niestandardowe, zalezne od architektury komputera. Wartosc FLT_ROUNDS powinna odzwierciedlac biezacy tryb zaokraglania ustawiony przez fesetround() (patrz takze USTERKI). Srodowisko zmiennoprzecinkowe Cale srodowisko zmiennoprzecinkowe, wlaczajac w to tryby sterowania i znaczniki stanu, moze byc obslugiwane jako jeden nieprzezroczysty obiekt typu fenv_t. Srodowisko domyslne jest okreslone przez FE_DFL_ENV (typu const fenv_t *). Sa to ustawienia srodowiska przy uruchomieniu programu i sa one zdefiniowane przez ISO C jako: zaokraglanie do najblizszej, wszystkie wyjatki wyzerowane i tryb nieprzerywany (kontynuacja w przypadku wystapienia wyjatku). Funkcja fegetenv() zachowuje biezace srodowisko zmiennoprzecinkowe w obiekcie *envp. Funkcja feholdexcept() robi to samo, a nastepnie zeruje wszystkie znaczniki wyjatkow i ustawia tryb nieprzerywany (kontynuacja w przypadku wystapienia wyjatku), o ile to mozliwe. Zwraca zero, gdy sie powiedzie. Funkcja fesetenv() odtwarza srodowisko zmiennoprzecinkowe z obiektu *envp. Obiekt ten musi byc znany jako poprawny, na przyklad jako wynik wywolania fegetenv() lub feholdexcept() lub jako rowny FE_DFL_ENV. To wywolanie nie zglasza wyjatkow. Funkcja feupdateenv() instaluje srodowisko zmiennoprzecinkowe odwzorowane w obiekcie *envp, poza tym, ze obecnie zgloszone wyjatki nie sa zerowane. Po jej wywolaniu, zgloszone wyjatki beda bitowym OR tych zgloszonych wczesniej oraz zawartych w *envp. Jak poprzednio, obiekt *envp musi byc znany jako poprawny. WARTOSC ZWRACANA Funkcje te zwracaja zero, gdy sie powioda, lub wartosc niezerowa, gdy wystapi blad. ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +---------------------------+--------------------------+---------------+ |Interfejs | Atrybut | Wartosc | +---------------------------+--------------------------+---------------+ |feclearexcept(), | Bezpieczenstwo watkowe | MT-bezpieczne | |fegetexceptflag(), | | | |feraiseexcept(), | | | |fesetexceptflag(), | | | |fetestexcept(), | | | |fegetround(), | | | |fesetround(), fegetenv(), | | | |feholdexcept(), | | | |fesetenv(), feupdateenv(), | | | |feenableexcept(), | | | |fedisableexcept(), | | | |fegetexcept() | | | +---------------------------+--------------------------+---------------+ STANDARDY C11, POSIX.1-2008, IEC 60559 (IEC 559:1989), ANSI/IEEE 854. HISTORIA C99, POSIX.1-2001. glibc 2.1. UWAGI Uwagi dla glibc If possible, the GNU C Library defines a macro FE_NOMASK_ENV which represents an environment where every exception raised causes a trap to occur. You can test for this macro using #ifdef. It is defined only if _GNU_SOURCE is defined. The C99 standard does not define a way to set individual bits in the floating-point mask, for example, to trap on specific flags. Since glibc 2.2, glibc supports the functions feenableexcept() and fedisableexcept() to set individual floating-point traps, and fegetexcept() to query the state. #define _GNU_SOURCE /* Patrz feature_test_macros(7) */ #include int feenableexcept(int excepts); int fedisableexcept(int excepts); int fegetexcept(void); Funkcje feenableexcept() i fedisableexcept() wlaczaja (wylaczaja) pulapkowanie poszczegolnych wyjatkow odwzorowanych w przez excepts i zwracaja poprzednie ustawienie pulapkowania wyjatkow, jesli sie powioda, a -1 w pozostalych przypadkach. Funkcja fegetexcept() zwraca biezace ustawienie pulapkowania wyjatkow. USTERKI C99 okresla, ze wartosc FLT_ROUNDS powinna odzwierciedlac zmiany biezacego trybu zaokraglania ustawiane przez fesetround(). Obecnie to nie dziala: FLT_ROUNDS ma zawsze wartosc 1. ZOBACZ TAKZE math_error(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. fenv(3)