Privacy Policy Cookie Policy Terms and Conditions Liczba zmiennoprzecinkowa - Wikipedia, wolna encyklopedia

Liczba zmiennoprzecinkowa

Z Wikipedii

Ten artykuł wymaga dopracowania.
Należy w nim poprawić: Brak kosekwencji w umieszczeniu wzorów, częśc jest do lewej, część środkowana. Centrowanie wygląda okropnie na ekranach o dużej szerokości. Proponuję do lewej z odsunięciem ::.
Więcej informacji co należy poprawić, być może znajdziesz w dyskusji tego artykułu lub na odpowiedniej stronie. W pracy nad artykułem należy korzystać z zaleceń edycyjnych. Po naprawieniu wszystkich błędów można usunąć tę wiadomość.
Możesz także przejrzeć pełną listę stron wymagających dopracowania.


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.

IEEE-754 single
Powiększ
IEEE-754 single

Wartość liczby zmiennoprzecinkowej jest obliczana wg wzoru:

x = S \cdot M \cdot B^E

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 policzalnego 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 = BB − (m − 1)

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

  • x_{\min} = M_{\min} \cdot B^{E_{\min}} = 1 \cdot B^{E_{min}}
  • x_{\max} = M_{\max} \cdot B^{E_{\max}} = \left( B-B^{-(m-1)} \right) \cdot B^{E_{max}} < B^{E_{max}+1}.

Zakres liczb, które mogą być reprezentowane w danym zapisie wynosi:

[-x_{\max}, -x_{\min}] \cup \{0\} \cup [x_{\min}, x_{\max}]

Zero jest wartością specjalną, która nie może zostać bezpośrednio reprezentowana w tym formacie.

Błąd względny reprezentacji wynosi \frac{1}{B^{m-1}} (inaczej: waga najmniej znaczącej cyfry mantysy). Błędów bezwzględnych na ogół się nie podaje.


Jeżeli komputer wygeneruje liczbę |x|<B^{E_{\min}}, to traktowana jest jako niedomiar (underflow).

W przypadku, gdy otrzymana liczba |x|>M_{\max} \cdot B^{E_{\max}}, to traktowana jest jako nadmiar wykładniczy (overflow).

Spis treści

[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.

  1. Pierwszy etap to normalizacja mantysy, sytuacja przedstawia się następująco: M=60,89523, \quad E=0. 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.
  2. Po normalizacji (przesunięciu przecinka o 1 pozycje w lewo) otrzymujemy:M=6,089523, \quad E=1
  3. Ostatnim krokiem jest odpowiednie obcięcie (ang. truncate), albo zaokrąglenie (ang. round) mantysy do zadanej ilości cyfr.
  • obcięcie: 6,089 \cdot 10^1
  • zaokrąglenie: 6,090 \cdot 10^1

[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:

  • (x + y) + z \neq x + (y + z)
  • (x \cdot y) \cdot z \neq x \cdot (y \cdot z),

ani rozdzielna czyli może zachodzić różność:

  • x \cdot (y + z) \neq (x \cdot y) + (x \cdot z)

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

[edytuj] Dodawanie i odejmowanie

x_1 = M_1 \cdot B^{E_1}, x_2 = M_2 \cdot B^{E_2} – przyjmujemy, że E1 < E2.

x_1 \pm x_2 = (M_1 \pm M_2 \cdot B^{E_2-E_1}) \cdot B^{E_1}

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 B^{E_2-E_1}.

[edytuj] Mnożenie

x_1 \cdot x_2 = (M_1 \cdot M_2) \cdot B^{E_1+E_2}

[edytuj] Dzielenie

x_1/x_2 = (M_1 / M_2) \cdot B^{E_1-E_2}

[edytuj] Błędy operacji elementarnych

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

\bar{x} = x(1 + \varepsilon_x)

Wówczas błąd względny poszczególnych operacji elementarnych wykonywanych na liczbach \bar{a}=a(1+\varepsilon_a) oraz \bar{b}=b(1+\varepsilon_b) można oszacować następująco:

  • dodawanie/odejmowanie: \varepsilon_{a \pm b} = \frac{a \varepsilon_a \pm b \varepsilon_b}{a \pm b} + \varepsilon_{\pm}
  • mnożenie: \varepsilon_{a \cdot b} = \varepsilon_a + \varepsilon_b + \varepsilon_{\cdot}
  • dzielenie: \varepsilon_{a / b} = \varepsilon_a - \varepsilon_b + \varepsilon_{/}

gdzie \varepsilon_{\pm}, \varepsilon_{\cdot} i \varepsilon_{/} to błędy wprowadzane przez dane opracje arytmetyczne.

Rozbijając każde wyrażnie 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). To wiąże się z trzema zaletami:

  1. 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ą.
  2. Zasady zaokrąglania są elementarne.
  3. 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).

Powszechnie przyjęty standard przechowywania liczb zmiennoprzecinkowych to IEEE-754. 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 wspiera 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 zmiennopozycyjnych 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)

Wykładnik zapisany jest w kodzie z przesunięciem (ang. biased exponent), tzn. że właściwą wartość wykładnika uzyskuje się odejmując przesunięcie (ang. bias). Wartość liczby zmiennoprzecinkowej oblicza się ze wzoru:

x = (-1)^S \cdot M \cdot 2^{E - \textrm{bias}}

gdzie S to bit znaku; liczba jest ujemna, gdy na bicie znaku jest równy 1, w przeciwnej sytuacji jest 0.

[edytuj] Wartości specjalne

Oprócz zwykłych liczb, zdefiniowano następujące wartości specjalne:

  • NaN – dosłownie nie-liczba (Not-A-Number), to liczba która nie reprezentuje wartości liczbowej.
    • SNaNSignificant NaN (Istotne NaN) - rozróżnienie wprowadzone w procesorach Intel; jeśli wystąpi SNaN procesor generuje wyjątek.
    • QNaN – Quiet NaN ("ciche" NaN) – wystąpienie nie powoduje wyjątku; np. w operacjach SSE można ustalić, że liczba operacja QNaN → 0.
  • Zero – rozróżnia się +0.0 i -0.0.
  • Nieskończoność
  • Liczba zdenormalizowana – pojawia się, gdy występuje niedomiar (ang. underflow), ale wynik operacji jeszcze można zapisać denormalizując mantysę (mantysa jest 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 +0.0 0 000..000 000...000 wszystkie bity mantysy i wykładnika równe 0, znak równy 0
Zero -0.0 1 000..000 000...000 wszystkie bity mantysy i wykładnika równe 0, znak równy 1
(\pm)Nieskończoność x 111..111 000...000000 wszystkie bity mantysy są równe 0, wszystkie bity wykładnika równe 1

[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ż

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu