Liczba zmiennoprzecinkowa – reprezentacja liczby rzeczywistej zapisanej za pomocą notacji naukowej. Ze względu na wygodę operowania na takich liczbach, przyjmuje się ograniczony zakres na mantysę i cechę – nazwy te mają w matematyce znaczenie podane w artykule podłoga i sufit, a w niniejszym artykule inne, powszechne w informatyce. Powoduje to, że reprezentacja liczby rzeczywistej jest tylko przybliżona, a jedna liczba zmiennoprzecinkowa może reprezentować różne liczby rzeczywiste z pewnego zakresu.
Spis treści |
Wartość liczby zmiennoprzecinkowej jest obliczana według wzoru:

gdzie:
Mantysa jest znormalizowana, tj. należy do przedziału
(przedział prawostronnie otwarty!). Jeżeli M jest stałe, a E zmienia się, wówczas przesunięciu ulega przecinek – stąd właśnie pochodzi nazwa tej reprezentacji.
Zarówno dla mantysy jak i wykładnika liczba cyfr jest z góry ustalona. Zatem dana liczba jest reprezentowana z pewną skończoną dokładnością i należy do skończonego zbioru wartości.
Załóżmy, że m to liczba cyfr przeznaczonych na mantysę, natomiast n+1 to liczba cyfr przeznaczonych na wykładnik (n cyfr dla wartości i 1 dla znaku wykładnika). Uznaje się również, że jedna dodatkowa pozycja (najstarsza) zarezerwowana jest dla zapisu znaku całej liczby. Wówczas wartości maksymalne i minimalne dla M i E określone są następująco:




Stąd najmniejsza i największa liczba dodatnia możliwa do zapisania w takiej reprezentacji to:

.Zakres liczb, które mogą być reprezentowane w danym zapisie wynosi:
![[-x_{\max}, -x_{\min}] \cup \{0\} \cup [x_{\min}, x_{\max}]](http://upload.wikimedia.org/wikipedia/pl/math/5/2/c/52c8771573d4165f5ac6d9823cd28bb3.png)
Zero jest wartością specjalną, która nie może zostać bezpośrednio reprezentowana w tym formacie.
Błąd względny reprezentacji wynosi
(inaczej: waga najmniej znaczącej cyfry mantysy). Błędów bezwzględnych na ogół się nie podaje.
Jeżeli komputer wygeneruje liczbę
, to traktowana jest jako niedomiar (underflow).
W przypadku, gdy otrzymana liczba
, to traktowana jest jako nadmiar wykładniczy (overflow).
Przyjmijmy, że B=10, liczba cyfr dziesiętnych przeznaczonych na mantysę wynosi 4, natomiast na wykładnik 2. Chcemy zapisać wartość 60,89523.
Przykład dla liczby mniejszej od 1: 0,0000125.
Arytmetyka zmiennoprzecinkowa nie jest łączna. To znaczy, że dla x, y i z mogą zachodzić różności:

,Nie jest też rozdzielna, czyli może zachodzić różność:

Innymi słowy, kolejność wykonywania operacji wpływa na końcowy wynik.
Przy obliczeniach zmiennoprzecinkowych występują też:
Załóżmy że chcemy dodać lub odjąć dwie dodatnie liczby zmiennoprzecinkowe:
oraz
, przy czym
. Założenia te można spełnić dla dowolnych liczb zmiennoprzecinkowych manipulując ich kolejnością, znakiem wyniku oraz rodzajem wykonywanej operacji, według poniższego schematu:

Wówczas:

Jeśli liczby mają różne wykładniki, to podczas dodawania mantysa liczby o mniejszym wykładniku musi zostać zdenormalizowana – we wzorze jest to przemnożenie
przez czynnik
. W szczególnym przypadku, jeśli
jest większe niż
(liczba cyfr mantysy), to po denormalizacji mantysa będzie miała wartość 0, a liczba o mniejszym wykładniku nie wpłynie na wynik dodawania bądź odejmowania.
Odejmowanie liczb zmiennoprzecinkowych o takim samym wykładniku
i niewiele różniącej się mantysie powoduje, że wynikowa mantysa jest znacznie zdenormalizowana. Renormalizacja w takim wypadku wiąże się z wprowadzeniem sporej liczby nieznaczących zer na końcu mantysy. Jest to szczególnie niekorzystne, dlatego zwykle tak projektuje się obliczenia, by do tego nie dopuścić.
Mając dane liczby zmiennoprzecinkowe
i
:


Wygodnie jest przedstawić liczbę zmiennoprzecinkową jako wartość dokładną zaburzoną pewnym błędem reprezentacji
:

Wówczas błąd względny poszczególnych operacji elementarnych wykonywanych na liczbach
oraz
można oszacować następująco:



gdzie
,
i
to błędy wprowadzane przez dane operacje arytmetyczne.
Rozbijając każde wyrażenie arytmetyczne na operacje elementarne można za pomocą tych zależności oszacować powstałe błędy. Istnieją jednak lepsze i szybsze metody modelowania błędów.
W implementacjach sprzętowych liczby zmiennoprzecinkowe wyraża się liczbami dwójkowymi (B=2). Ma to następujące zalety:
W celu ujednolicenia zasad operacji na liczbach zmiennoprzecinkowych na różnych platformach sprzętowych, opracowano standard IEEE 754, w oparciu o który realizuje się obecnie wszystkie implementacje sprzętowe liczb zmiennoprzecinkowych. Definiuje on dwie klasy liczb:
Są również inne sposoby zapisu, różniące się jedynie liczbą bitów przeznaczoną na poszczególne pola. Np. koprocesor w procesorach x86, oprócz typów standardowych, wspiera liczby 10-bajtowe, natomiast kompilator Pascala - liczby 6-bajtowe[1]. Liczby zgodne ze standardem IEEE 754 mają dokładnie określoną semantykę, jak na przykład: dokładność operacji elementarnych, kierunki zaokrągleń, czy obsługa sytuacji wyjątkowych – są to cechy bardzo pożądane w zastosowaniach naukowych i inżynieryjnych, a również ułatwiają przenoszenie kodu programu na inny sprzęt.
| Format | Znak [bity] | Wykładnik [bity] | Mantysa [bity] | Szerokość słowa [bity] | Typy w językach programowania |
|---|---|---|---|---|---|
| IEEE-754 single | 1 | 8 | 23 | 32 | float (C), single (Pascal), real*4 (Fortran) |
| IEEE-754 double | 1 | 11 | 52 | 64 | double (C), real lub double (Pascal), real*8 (Fortran) |
| koprocesor x87 | 1 | 15 | 64 | 80 | long double (C99), extended (Pascal) |
| Turbo Pascal | 1 | 8 | 39 | 48 | real |
| SSE5, OpenGL 3.0[2] | 1 | 5 | 10 | 16 | w OpenGL nazywana half-float |
Wykładnik będący liczbą całkowitą jest zapisywany w kodzie uzupełnień do dwa, co można interpretować jako wartość przesuniętą o pewną stałą (ang. biased exponent). Właściwą wartość wykładnika uzyskuje się odejmując od zakodowanego wykładnika wartość przesunięcia (ang. bias). Wartość liczby zmiennoprzecinkowej oblicza się ze wzoru:

gdzie S to bit znaku; liczba jest ujemna, gdy bit znaku jest równy 1, w przeciwnej sytuacji ma on wartość 0.
Typowe wartości przesunięcia dla koprocesora x87 (występującego w procesorach x86) wynoszą:
Oprócz zwykłych liczb zdefiniowano następujące wartości specjalne:
| Wartość specjalna | Bit znaku | Bity wykładnika | Bity mantysy | Uwagi |
|---|---|---|---|---|
| NaN | x | 111..111 | xxxx...xxx | wszystkie bity wykładnika są równe 1, natomiast mantysa ma niezerową wartość |
| QNaN | x | 111..111 | 1xxx...xxx | uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 1 |
| SNaN | x | 111..111 | 0xxx...xxx | uwagi jak dla NaN, ale pierwszy bit mantysy zawsze równy 0 |
| ±Zero | x | 000..000 | 0000...000 | wszystkie bity mantysy i wykładnika równe 0, bit znaku decyduje o znaku wartości |
| ±Nieskończoność | x | 111..111 | 0000...000 | wszystkie bity mantysy równe 0, wszystkie bity wykładnika równe 1, bit znaku decyduje o znaku wartości |
| Zdenormalizowana | x | 000..000 | xxxx...xxx | mantysa różna od 0, wszystkie bity wykładnika równe 0, bit znaku decyduje o znaku wartości |
Rozmiar typów zmiennoprzecinkowych zależy od konkretnych implementacji. Standardowo, typ float zajmuje co najmniej 4 bajty, double 8 bajtów, a long double zazwyczaj 8-16 bajtów. W przypadku kompilatora GCC w wersji 4.6.2, długości typów wynoszą odpowiednio 4, 8 i 16 bajtów, a w Visual C++ – 4, 8 i 8 bajtów.
W standardzie języka Pascal ISO/IEC 7185 :1990 jest wymagany typ real obejmujący podzbiór liczb rzeczywistych. Turbo Pascal wykorzystuje cztery typy zmiennoprzecinkowe (typ, liczba bajtów, liczba cyfr znaczących, zakres wartości):
Delphi, obsługuje te same typy, przy czym w domyślnych ustawieniach opcji kompilatora, typ real jest równoważny typowi double, a sześciobajtowy nazwano real48. We free Pascalu typ real jest zastępowany przez single lub double.
W oryginalnej specyfikacji języka Fortran typ real miał dwie możliwe długości REAL i DOUBLE PRECISION. Zakres i precyzja obydwu typów nie były wyspecyfikowane, lecz zależały od architektury konkretnego komputera, z wymaganiem aby DOUBLE PRECISION miał wyższą precyzję i co najmniej taki sam zakres co REAL.
Z czasem rynek został całkowicie zdominowany przez komputery o architekturze opartej na 8-bitowych bajtach, przyjęło się, że podstawowy typ REAL zajmuje 4 bajty. Współczesne kompilatory Fortranu dopuszczają deklaracje:
Niektóre implementacje dopuszczają także typ:
Nowsze specyfikacje języka FORTRAN, poczynając od FORTRAN90, umożliwiają programiście deklarowanie wymaganej precyzji i zakresu liczb zmiennoprzecinkowych w oderwaniu od konkretnej implementacji. Wbudowana funkcja SELECTED_REAL_KIND(p,r) zwraca dla konkretnego procesora najkrótszą reprezentację o co najmniej wskazanej dokładności i zakresie. Na przykład SELECTED_REAL_KIND(10,80) zwróci dla danego procesora typ liczby zmiennoprzecinkowej o dokładności co najmniej 10 cyfr znaczących i zakresie co najmniej do 1080. Istnieją też wbudowane funkcje PRECISION i RANGE pozwalające sprawdzić jaki rzeczywisty zakres i dokładność mają liczby zmiennoprzecinkowe podanego typu w danym procesorze[3].
Sposoby wyświetlania liczb zmiennoprzecinkowych:
Binarne liczby zmiennoprzecinkowe po raz pierwszy zastosował Konrad Zuse w mechanicznym komputerze Z1.
|
||||||||