Web - Amazon

We provide Linux to the World


We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Liczba zmiennoprzecinkowa - Wikipedia, wolna encyklopedia

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

Reprezentacja zmiennoprzecinkowa IEEE-754 single
Reprezentacja zmiennoprzecinkowa 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 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 = 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).

[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
  • niedomiar

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

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

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

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)
    • SNaN – istotne NaN (ang. Significant NaN) - rozróżnienie wprowadzone w procesorach firmy Intel; jeśli wystąpi SNaN procesor generuje wyjątek.
    • QNaN – ciche NaN (ang. Quiet 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ść - 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
(\pm)Zero x 000..000 0000...000 wszystkie bity mantysy i wykładnika równe 0, bit znaku decyduje o znaku wartości
(\pm)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ż

Our "Network":

Project Gutenberg
https://gutenberg.classicistranieri.com

Encyclopaedia Britannica 1911
https://encyclopaediabritannica.classicistranieri.com

Librivox Audiobooks
https://librivox.classicistranieri.com

Linux Distributions
https://old.classicistranieri.com

Magnatune (MP3 Music)
https://magnatune.classicistranieri.com

Static Wikipedia (June 2008)
https://wikipedia.classicistranieri.com

Static Wikipedia (March 2008)
https://wikipedia2007.classicistranieri.com/mar2008/

Static Wikipedia (2007)
https://wikipedia2007.classicistranieri.com

Static Wikipedia (2006)
https://wikipedia2006.classicistranieri.com

Liber Liber
https://liberliber.classicistranieri.com

ZIM Files for Kiwix
https://zim.classicistranieri.com


Other Websites:

Bach - Goldberg Variations
https://www.goldbergvariations.org

Lazarillo de Tormes
https://www.lazarillodetormes.org

Madame Bovary
https://www.madamebovary.org

Il Fu Mattia Pascal
https://www.mattiapascal.it

The Voice in the Desert
https://www.thevoiceinthedesert.org

Confessione d'un amore fascista
https://www.amorefascista.it

Malinverno
https://www.malinverno.org

Debito formativo
https://www.debitoformativo.it

Adina Spire
https://www.adinaspire.com