Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Liczby zmiennoprzecinkowe używają formatu IEEE (Institute of Electrical and Electronics Engineers). Wartości o pojedynczej precyzji z typem zmiennoprzecinkowym mają 4 bajty, składające się z bitu znaku, 8-bitowego wykładnika binarnego nadmiaru-127 i 23-bitowej mantissa. Mantissa reprezentuje liczbę z zakresu od 1.0 do 2.0. Ponieważ bit mantysy o wysokiej kolejności jest zawsze 1, nie jest przechowywany w liczbie. Ta reprezentacja daje zakres od około 3,4E-38 do 3,4E+38 dla typu float.
Zmienne można zadeklarować jako zmiennoprzecinkowe lub podwójne, w zależności od potrzeb aplikacji. Główne różnice między dwoma typami są istotnością, którą mogą reprezentować, wymaganym magazynem i ich zakresem. W poniższej tabeli przedstawiono relację między istotnością a wymaganiami magazynu.
Typy zmiennoprzecinkowe
| Typ | Cyfry znaczące | Liczba bajtów |
|---|---|---|
| float | 6 - 7 | 100 |
| double | 15 - 16 | 8 |
Zmienne zmiennoprzecinkowe są reprezentowane przez mantissa, która zawiera wartość liczby i wykładnik, który zawiera kolejność wielkości liczby.
W poniższej tabeli przedstawiono liczbę bitów przydzielonych do mantissa i wykładnik dla każdego typu zmiennoprzecinkowego. Najbardziej znaczącym bitem każdego zmiennoprzecinka lub podwójnego jest zawsze bit znaku. Jeśli ma wartość 1, liczba jest uznawana za ujemną; w przeciwnym razie jest traktowana jako liczba dodatnia.
Długości wykładników i mantissas
| Typ | Długość wykładnicza | Długość mantysy |
|---|---|---|
| float | 8 bitów | 23 bity |
| double | 11 bitów | 52 bity |
Ponieważ wykładniki są przechowywane w postaci niepodpisanej, wykładnik jest stronniczy o połowę jego możliwej wartości. W przypadku typu zmiennoprzecinkowa stronnicza wynosi 127; dla typu double, jest to 1023. Możesz obliczyć rzeczywistą wartość wykładniczą, odejmując wartość stronniczą od wartości wykładniczej.
Mantissa jest przechowywana jako ułamek binarny większy lub równy 1 i mniejszy niż 2. W przypadku typów float i double istnieje sugerowane wiodące 1 w mantissa w najbardziej znaczącej pozycji bitowej, więc mantissas są w rzeczywistości 24 i 53 bity długości, mimo że najbardziej znaczący bit nigdy nie jest przechowywany w pamięci.
Zamiast właśnie opisanej metody przechowywania pakiet zmiennoprzecinkowa może przechowywać binarne liczby zmiennoprzecinkowe jako zdenormalizowane liczby. "Zdenormalizowane liczby" są liczbami zmiennoprzecinkowymi bezzerowymi z zastrzeżonymi wartościami wykładniczymi, w których najbardziej znaczący bit mantissa wynosi 0. Używając formatu zdenormalizowanego, zakres liczby zmiennoprzecinkowych można rozszerzyć kosztem precyzji. Nie można kontrolować, czy liczba zmiennoprzecinkowa jest reprezentowana w postaci znormalizowanej lub zdenormalizowanej; pakiet zmiennoprzecinkowa określa reprezentację. Pakiet zmiennoprzecinkowa nigdy nie używa zdenormalizowanej formy, chyba że wykładnik staje się mniejszy niż minimum, które można przedstawić w znormalizowanym formularzu.
W poniższej tabeli przedstawiono wartości minimalne i maksymalne, które można przechowywać w zmiennych każdego typu zmiennoprzecinkowego. Wartości wymienione w tej tabeli dotyczą tylko znormalizowanych liczb zmiennoprzecinkowych; zdenormalizowane liczby zmiennoprzecinkowe mają mniejszą wartość minimalną. Należy pamiętać, że liczby przechowywane w rejestrach 80x87 są zawsze reprezentowane w postaci znormalizowanej 80-bitowej; liczby mogą być reprezentowane tylko w postaci zdenormalizowanej, gdy są przechowywane w 32-bitowych lub 64-bitowych zmiennych zmiennoprzecinkowych (zmiennych typu zmiennoprzecinkowych i długich).
Zakres typów zmiennoprzecinkowych
| Typ | Wartość minimalna | Wartość maksymalna |
|---|---|---|
| float | 1.175494351 E - 38 | 3.402823466 E + 38 |
| double | 2.2250738585072014 E - 308 | 1.7976931348623158 E + 308 |
Jeśli precyzja jest mniejsza niż magazyn, rozważ użycie zmiennoprzecinkowej typu dla zmiennych zmiennoprzecinkowych. Z drugiej strony, jeśli precyzja jest najważniejszym kryterium, użyj typu double.
Zmienne zmiennoprzecinkowe mogą być promowane do typu większego istotności (od typu float do typu double). Podwyższenie poziomu często występuje podczas wykonywania arytmetyki w zmiennych zmiennoprzecinkowych. Ta arytmetyka jest zawsze wykonywana w tak wysokim stopniu dokładności, jak zmienna o najwyższym stopniu dokładności. Rozważmy na przykład następujące deklaracje typów:
float f_short;
double f_long;
long double f_longer;
f_short = f_short * f_long;
W poprzednim przykładzie zmienna f_short jest promowana do typu dwukrotnie i mnożonego przez f_long, a następnie wynik jest zaokrąglany do typu float przed przypisaniem do f_short.
W poniższym przykładzie (który używa deklaracji z poprzedniego przykładu), arytmetyka jest wykonywana w precyzji zmiennoprzecinkowej (32-bitowej) dla zmiennych; wynik jest następnie promowany do typu double:
f_longer = f_short * f_short;