Liczba zmiennoprzecinkowa
Z Wikipedii
Liczba zmiennoprzecinkowa jest komputerową reprezentacją liczb rzeczywistych zapisanych w postaci wykładniczej (zwanej też notacją naukową). Ze względu na wygodę operowania na takich liczbach przyjmuje się ograniczony zakres na mantysę i cechę. Powoduje to, że liczba jest określana z pewną dokładnością i może występować w określonym zakresie.
Spis treści |
[edytuj] Podstawa matematyczna
Wartość liczby zmiennoprzecinkowej jest obliczana wg wzoru:
gdzie:
- S (ang. sign) - znak liczby, 1 lub -1
- M (ang. mantissa) - znormalizowana mantysa, liczba ułamkowa
- B (ang. base) - podstawa systemu liczbowego (2 dla systemów komputerowych)
- E (ang. exponent) - wykładnik, liczba całkowita
Mantysa jest znormalizowana, tj. należy do przedziału [1,B) (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 ilość 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:
- Wykładnik E:
- Emin = − Bn + 1
- Emax = Bn − 1
- Mantysa M:
- Mmin = 1
- Mmax = B − B − (m − 1)
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:
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).
[edytuj] Przykład reprezentacji
Przyjmijmy, że B = 10, ilość cyfr dziesiętnych przeznaczonych na mantysę wynosi 4, natomiast na wykładnik 2. Chcemy zapisać liczbę 60,89523.
- Pierwszy etap to normalizacja mantysy, sytuacja przedstawia się następująco:
. Mantysa M nie należy do zadanego przedziału [1,10), zatem należy przesuwać przecinek w lewo do chwili, aż wartość M będzie doń należała. Przesuwanie przecinka w lewo wiąże się ze zwiększaniem E. - Po normalizacji (przesunięciu przecinka o 1 pozycje w lewo) otrzymujemy:

- Ostatnim krokiem jest odpowiednie obcięcie (ang. truncate), albo zaokrąglenie (ang. round) mantysy do zadanej ilości cyfr.
- obcięcie:

- zaokrąglenie:

- obcięcie:
[edytuj] Operacje na liczbach zmiennoprzecinkowych
[edytuj] Własności arytmetyki zmiennoprzecinkowej
Arytmetyka zmiennoprzecinkowa nie jest łączna. To znaczy: iż dla x, y i z mogą zachodzić różności:

,
ani 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ż inne problemy:
- zaokrąglenia
- nieprawidłowe operacje
- przepełnienie
- niedomiar
[edytuj] Dodawanie i odejmowanie
,
– przyjmujemy, że E1 < E2.
Jeśli liczby mają różne wykładniki, to podczas dodawania jedna z mantys musi zostać zdenormalizowana – we wzorze jest to przemnożenie M2 przez czynnik
.
[edytuj] Mnożenie
[edytuj] Dzielenie
[edytuj] Błędy operacji elementarnych
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:
- dodawanie/odejmowanie:

- mnożenie:

- dzielenie:

gdzie
,
i
to błędy wprowadzane przez dane opracje 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.
[edytuj] Implementacje sprzętowe
W implementacjach sprzętowych liczby zmiennoprzecinkowe są zrelizowane na liczbach dwójkowych (B=2). Wiąże się to z następującymi zaletami:
- Mantysa należy do przedziału [1,2), jest więc postaci 1.xxxxx.... (x - bit o dowolnej wartości). Ponieważ część całkowita jest znana, równa zawsze 1, nie jest zapamiętywana, co daje dodatkowy bit na część ułamkową.
- Ponieważ znak liczby jest zapamiętywany na jednym bicie, to otrzymanie modułu i wartości przeciwnej wymaga, odpowiednio, wyzerowaniu tego bitu (logiczna operacja AND), lub zmiany na wartość przeciwną (logiczna operacja XOR).
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 praktycznie wszystkie implementacje sprzętowe liczb zmiennoprzecinkowych. Definiuje on dwie klasy liczb:
- pojedynczej precyzji (ang. single)
- podwójnej precyzji (ang. double)
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 ponadto liczby 10-bajtowe, natomiast kompilator Pascala liczby 6-bajtowe (firma Borland w kompilatorach języka Pascal począwszy od wersji Delphi 3.0 przyjęła za standard liczb zmiennoprzecinkowych liczby typu double, stary typ został nazwany real48 i jest obsługiwany w celu zachowania kompatybilności z poprzednimi wersjami, ale ma status przestarzałego elementu języka, który w pewnym momencie może przestać być obsługiwany).
| 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-854 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) |
| kompilator Pascala | 1 | 8 | 39 | 48 | real/real48 (Pascal) |
| SSE5 | 1 | 5 | 10 | 16 |
[edytuj] Przesunięcie wykładnika
Wykładnik, w celu uniknięcia konieczności kodowania jego znaku (liczba miałaby dwa bity znaku), zapisywany jest 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 jest 0.
Typowe wartości przesunięcia dla koprocesora x87 (występującego w procesorach x86) wynoszą:
- 127 (7FH) w formacie 32-bitowym
- 1023 (3FFH) w formacie 64-bitowym
- 16383 (3FFFH) w formacie 80-bitowym
[edytuj] Wartości specjalne
Oprócz zwykłych liczb, zdefiniowano następujące wartości specjalne:
- NaN – nie-liczba (ang. Not-A-Number), to symbol, który nie reprezentuje wartości liczbowej, powstały zazwyczaj w wyniku niedozwolonej operacji (np. pierwiastkowanie liczby ujemnej)
- Zero – rozróżnia się +0,0 i -0,0.
- Nieskończoność - jest wynikiem operacji w przypadku wystąpienia nadmiaru (przepełnienia), przy dzieleniu przez 0, itp.; może być dodatnia lub ujemna.
- Liczba zdenormalizowana – pojawia się, gdy występuje niedomiar (ang. underflow), ale wynik operacji jeszcze można zapisać denormalizując mantysę (w takim przypadku mantysa reprezentuje liczbę w postaci 0.xxx...xxx, a nie 1.xxx...xxxx).
| 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 |
[edytuj] Typy zmiennoprzecinkowe w językach programowania
[edytuj] C, C++
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-12 bajtów. W przypadku kompilatora GCC w wersji 3.3.5, długości typów wynoszą odpowiednio 4, 8 i 12 bajtów.
[edytuj] Pascal
Zadeklarowane zmienne typu real mogą przyjmować wartości rzeczywiste z przedziału od 2.9 · 10-39 do 1.7 · 1038, co wynika z przeznaczenia na taką liczbę 6 bajtów.
[edytuj] Fortran
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 o 8-bitowe bajty, przyjęło się, że podstawowy typ REAL zajmuje 4 bajty. Wspólczesne kompilatory Fortran-u dopuszczają deklaracje:
- REAL*4 lub po prostu REAL – 32 bity, odpowiednik typu float w języku C
- REAL*8 lub DOUBLE PRECISION – 64 bity, odpowiednik typu double w języku C
Niektóre implementacje dopuszczają także typ:
- REAL*16 – 128 bitów.
[edytuj] Kalkulator
Sposoby wyświetlania liczb zmiennoprzecinkowych:
- FLO (Floating Notation)- notacja dziesiętna - tryb domyślny. Jeżeli jest to możliwe wyświetla liczbę z wykładnikiem równym 0 pomijając jego wyświetlanie
- SCE (Scientific Notation)- notacja naukowa - zawsze wyświetla liczbę z wykładnikiem
- ENG (Engineering Notation)- notacja inżynierska - zawsze wyświetla liczbę z wykładnikiem podzielnym przez 3.
[edytuj] Historia
Binarne liczby zmiennoprzecinkowe po raz pierwszy zastosował Konrad Zuse w mechanicznym komputerze Z1.
[edytuj] Zobacz też
Typy podstawowe: bool • char • double • float • int • void
Typy złożone: class • enum • struct • tablica • union • wskaźnik
| Polski dziennikarz nagrodzony na Ukrainie |
|
Dziennikarz "Gazety Wyborczej" Marcin Wojciechowski odebrał we Lwowie nagrodę im. Ołeksandra Krywenki, przyznawaną za sprzyjanie porozumieniu między Ukraińcami i Polakami.
|
| Orange wycofuje się ze sponsorowania polskiej ligi |
|
Zarząd firmy PTK Centertel, operatora sieci komórkowej Orange, podjął decyzję o wycofaniu się z planów sponsoringu pierwszej ligi piłkarskiej w kolejnych trzech sezonach. Przez ostatnie trzy lata marka Orange była sponsorem tytularnym rozgrywek.
|
| Internetowe Radio Baobab na platformie "n" |
|
Internetowe Radio Baobab zostało włączone do oferty platformy cyfrowej "n".
|
| Wielki casting do czterech rozgłośni radiowych |
|
W ostatni weekend maja Eurozet przeprowadzi casting na pracowników Radia Zet oraz sieci: Planeta FM, Radio Puls i Antyradio.
|
| RMF FM coraz częściej słuchane, Trójka coraz rzadziej |
|
Największy wzrost słuchalności zanotowało radio RMF FM, a największy spadek – Program III Polskiego Radia – wynika z najnowszych badań Radio Track, realizowanych przez MillwardBrown SMG/KRC.
|

![[-x_{\max}, -x_{\min}] \cup \{0\} \cup [x_{\min}, x_{\max}]](http://upload.wikimedia.org/math/5/2/c/52c8771573d4165f5ac6d9823cd28bb3.png)






)Zero