Provided by:
manpages-pl-dev_20060617-1_all 
NAZWA
feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag,
fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv,
feupdateenv - zaokrąglanie zmiennoprzecinkowe i obsługa wyjątków w C99
SKŁADNIA
#include <fenv.h>
void feclearexcept(int excepts);
void fegetexceptflag(fexcept_t *flagp, int excepts);
void feraiseexcept(int excepts);
void fesetexceptflag(const fexcept_t *flagp, int excepts);
int fetestexcept(int excepts);
int fegetround(void);
int fesetround(int rounding_mode);
void fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *envp);
void fesetenv(const fenv_t *envp);
void feupdateenv(const fenv_t *envp);
OPIS
Tych jedenaście funkcji zdefiniowano w C99. Realizują one obsługę
zmiennoprzecinkowego zaokrąglania i wyjątków (nadmiar, dzielenie przez
zero, itp.).
Wyjątki
Wyjątek DivideByZero (dzielenie przez zero) występuje gdy dokładnym
wynikiem operacji na liczbach skończonych jest nieskończoność.
Wyjątek Overflow (nadmiar) występuje gdy wynik musi być przedstawiony
jako liczba zmiennoprzecinkowa, ale ma on (dużo) większą wartość
bezwzględną niż największa (skończona) liczba zmiennoprzecinkowa
posiadająca przedstawienie.
Wyjątek Underflow (niedomiar) występuje gdy wynik musi być
przedstawiony jako liczba zmiennoprzecinkowa, ale ma on mniejszą
wartość bezwzględną niż najmniejsza dodatnia znormalizowana iczba
zmiennoprzecinkowa (i nastąpiłaby duża utrata precyzji, gdyby
przedstawić go jako liczbę nieznormalizowaną).
Wyjątek Inexact (niedokładny) występuje gdy wynik operacji zaokrąglenia
nie jest równy wynikowi o nieskończonej precyzji. Może on towarzyszyć
wystąpieniu Overflow lub Underflow.
Wyjątek Invalid (nieprawidłowy) występuje gdy operacja nie ma dobrze
zdefiniowanego wyniku, jak dla 0/0, nieskończoność - nieskończoność lub
sqrt(-1).
Obsługa wyjątków
Wyjątki są reprezentowane na dwa sposoby: jako pojedyncze bity (wyjątek
obecny/nieobecny), które to bity odpowiadają w pewien zależny od
implementacji sposób pozycjom bitowym w liczbie całkowitej, i jako
nieprzezroczysta struktura, która może zawierać więcej informacji o
wyjątkach (zapewne adres kodu, gdzie wyjątek wystąpił).
Każde z makr FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW,
FE_UNDERFLOW jest zdefiniowane, gdy implementacja wspiera obsługę
odpowiedniego wyjątku, i wówczas definiuje ono odpowiedni(e) bit(y),
umożliwiając wywoływanie funkcji obsługi wyjątków, np. podając argument
całkowity FE_OVERFLOW|FE_UNDERFLOW. Dla innych wyjątków może nie być
wsparcia. Makro FE_ALL_EXCEPT jest bitowym OR wszystkich bitów
odpowiadającym wspieranym wyjątkom.
Funkcja feclearexcept zeruje wspierane wyjątki reprezentowane przez
bity jej argumentu.
Funkcja fegetexceptflag umieszcza odwzorowanie stanu znaczników
przypisanych wyjątkom reprezentowanym przez argument excepts w
nieprzezroczystym obiekcie *flagp.
Funkcja feraiseexcept zgłasza wspierane wyjątki reprezentowane przez
bity excepts.
Funkcja fesetexceptflag ustawia pełny stan o wartości *flagp dla
wyjątków reprezentowanych przez excepts. Wartość ta musi być otrzymana
jako wynik wcześniejszego wywołania fegetexceptflag z ostatnim
argumentem zawierającym wszystkie bity excepts.
Funkcja fetestexcept zwraca słowo z ustawionymi tymi bitami, które są
ustawione w argumencie excepts, i dla których jest aktualnie ustawiony
odpowiedni wyjątek.
Rounding
Każde z makr FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD jest
zdefiniowane, gdy implementacja wspiera pobieranie i ustawianie
odpowiedniego kierunku zaokrąglania.
Funkcja fegetround zwraca makro odpowiedające aktualnemu trybowi
zaokrąglania.
Funkcja fesetround ustawia tryb zaokrąglania podany jako jej argument i
zwraca zero gdy się powiedzie.
Środowisko zmiennoprzecinkowe
Całe środowisko zmiennoprzecinkowe, włączając w to tryby sterowania i
znaczniki stanu, może być obsługiwane jako jeden nieprzezroczysty
obiekt typu fenv_t. Środowisko domyślne jest określone przez
FE_DFL_ENV (typu const fenv_t *). Są to ustawienia środowiska przy
uruchomieniu programu i są one zdefiniowane przez ISO C jako:
zaokrąglanie do najbliższej, wszystkie wyjątki wyzerowane i tryb
nieprzerywany (kontynuacja w przypadku wystąpienia wyjątku).
Funkcja fegetenv zachowuje aktualne środowisko zmiennoprzecinkowe w
obiekcie *envp.
Funkcja feholdexcept robi to samo, a następnie zeruje wszystkie
znaczniki wyjątków i ustawia tryb nieprzerywany (kontynuacja w
przypadku wystąpienia wyjątku), o ile to możliwe. Zwraca zero, gdy się
powiedzie.
Funkcja fesetenv odtwarza środowisko zmiennoprzecinkowe z obiektu
*envp. Obiekt ten musi być znany jako poprawny, np. jako wynik
wywołania fegetenv lub feholdexcept lub jako równy FE_DFL_ENV. To
wywołanie nie zgłasza wyjątków.
Funkcja feupdateenv instaluje środowisko zmiennoprzecinkowe odwzorowane
w obiekcie *envp, poza tym, że aktualnie zgłoszone wyjątki nie są
zerowane. Po jej wywołaniu, zgłoszone wyjątki będą bitowym OR tych
zgłoszonych wcześniej oraz zawartych w *envp. Jak poprzednio, obiekt
*envp musi być znany jako poprawny.
SZCZEGÓŁY GNU
O ile to możliwe, biblioteka GNU C definiuje makro FE_NOMASK_ENV
odwzorowujące środowisko, w którym każde zgłoszenie wyjątku powoduje
wystąpienie pułapki. Można sprawdzać wartość tego makra za pomocą
#ifdef. Jest ono zdefiniowane jedynie, gdy zdefiniowane jest
_GNU_SOURCE. Standard C99 nie określa sposobu ustawiania
poszczególnych bitów w masce zmiennoprzecinkowej, np. aby przechwytywać
tylko wybrane znaczniki. glibc 2.2 będzie obsługiwać funkcje
feenableexcept i fedisableexcept ustawiające wybrane znaczniki
zmiennoprzecinkowe oraz fegetexcept odpytującą o stan.
int feenableexcept (int excepts);
int fedisableexcept (int excepts);
int fegetexcept (void);
Funkcje feenableexcept i fedisableexcept włączają (wyłączają)
pułapkowanie poszczególnych wyjątków odwzorowanych w przez excepts i
zwracają poprzednie ustawienie pułapkowania wyjątków, jeśli się
powiodą, a -1 w pozostałych przypadkach. Funkcja fegetexcept zwraca
aktualne ustawienie pułapkowania wyjątków.
ZGODNE Z
IEC 60559 (IEC 559:1989), ANSI/IEEE 854, ISO C99 (ISO/IEC 9899:1999).