Niedomiar arytmetyczny — Arithmetic underflow

Termin niedomiar zmiennoprzecinkowy (również zmiennoprzecinkowych niedomiar lub po prostu niedomiar ) jest stanem, w programie komputerowym , gdzie wynikiem obliczeń jest liczba dokładniejszej wartości bezwzględnej niż komputer może rzeczywiście reprezentują w pamięci na swojej jednostki centralnej (CPU ).

Niedopełnienie arytmetyczne może wystąpić, gdy prawdziwy wynik operacji zmiennoprzecinkowej jest mniejszy (czyli bliższy zeru) niż najmniejsza wartość reprezentowana jako normalna liczba zmiennoprzecinkowa w docelowym typie danych . Dolny można częściowo uważany jako negatywny przelewem z wykładnikiem o wartości zmiennoprzecinkowej. Na przykład, jeśli wykładnik może reprezentować wartości od -128 do 127, wynik o wartości mniejszej niż -128 może spowodować niedopełnienie.

Przechowywanie wartości, które są zbyt niskie w zmiennej typu integer (np. próba przechowania -1 w liczbie całkowitej bez znaku ) jest właściwie określane jako integer overflow , lub szerzej, integer wraparound . Termin niedomiar zwykle odnosi się tylko do liczb zmiennoprzecinkowych, co stanowi osobną kwestię. W większości projektów zmiennoprzecinkowych nie jest możliwe przechowywanie zbyt niskiej wartości, ponieważ zwykle są one podpisane i mają ujemną wartość nieskończoności .

Luka niedomiarowa

Odstęp pomiędzy − fminN a fminN , gdzie fminN jest najmniejszą dodatnią wartością normalną zmiennoprzecinkową, nazywamy luką niedomiaru. Dzieje się tak, ponieważ rozmiar tego przedziału jest o wiele rzędów wielkości większy niż odległość między sąsiednimi wartościami normalnymi zmiennoprzecinkowymi tuż poza przerwą. Na przykład, jeśli typ danych zmiennoprzecinkowych może reprezentować 20 bitów , przerwa niedomiaru jest 221 razy większa niż bezwzględna odległość między sąsiednimi wartościami zmiennoprzecinkowymi tuż poza przerwą.

W starszych projektach luka niedomiarowa miała tylko jedną użyteczną wartość, zero. Gdy wystąpiło niedomiar, prawdziwy wynik był zastępowany przez zero (albo bezpośrednio przez sprzęt, albo przez oprogramowanie systemowe obsługujące podstawowy warunek niedomiaru). Ta zamiana nazywana jest „spłukiwaniem do zera”.

Wydanie IEEE 754 z 1984 r. wprowadziło liczby podnormalne . Liczby podnormalne (w tym zero) wypełniają lukę niedomiaru wartościami, w których bezwzględna odległość między sąsiednimi wartościami jest taka sama, jak dla sąsiednich wartości tuż poza odstępem niedomiaru. Umożliwia to „stopniowe niedopełnienie”, gdzie używana jest najbliższa wartość podnormalna, tak jak najbliższa wartość normalna jest używana, gdy tylko jest to możliwe. Nawet przy zastosowaniu stopniowego niedopełnienia najbliższa wartość może wynosić zero.

Bezwzględna odległość między sąsiednimi wartościami zmiennoprzecinkowymi tuż poza przerwą nazywana jest maszyną epsilon , zwykle charakteryzuje się największą wartością, której suma o wartości 1 da w wyniku odpowiedź o wartości 1 w tym schemacie zmiennoprzecinkowym. Można to zapisać jako , gdzie jest funkcją, która konwertuje wartość rzeczywistą na reprezentację zmiennoprzecinkową. Chociaż epsilon maszyny nie należy mylić z poziomem niedopełnienia (przy założeniu, że wartości niższe od normalnych), są one ściśle powiązane. Epsilon maszyny zależy od liczby bitów składających się na significand , natomiast poziom niedopełnienia zależy od liczby cyfr składających się na pole wykładnika. W większości systemów zmiennoprzecinkowych poziom dolnego przepływu jest mniejszy niż epsilon maszyny.

Obsługa niedomiaru

Wystąpienie niedomiaru może ustawić ("przyklejony") bit stanu, zgłosić wyjątek, na poziomie sprzętowym wygenerować przerwanie lub może spowodować pewną kombinację tych efektów.

Jak określono w IEEE 754 , stan niedomiaru jest sygnalizowany tylko wtedy, gdy występuje również utrata precyzji. Zazwyczaj jest to określane jako wynik niedokładny. Jeśli jednak użytkownik wyłapuje niedomiar, może się to zdarzyć niezależnie od uwzględnienia utraty precyzji. Domyślna obsługa w IEEE 754 niedomiaru (jak również innych wyjątków) polega na rejestrowaniu jako zmiennoprzecinkowego stanu, w którym wystąpił niedomiar. Jest to określone dla poziomu programowania aplikacji, ale często jest również interpretowane jako sposób obsługi tego na poziomie sprzętowym.

Zobacz też

Bibliografia