floating-pointRozpoczęcie pracy z liczbą zmiennoprzecinkową


Uwagi

W tej sekcji omówiono, czym jest zmiennoprzecinkowa i dlaczego deweloper może chcieć z niej skorzystać.

Powinien także wymieniać wszelkie duże tematy w zmiennoprzecinkowe i link do powiązanych tematów. Ponieważ dokumentacja zmiennoprzecinkowa jest nowa, konieczne może być utworzenie początkowych wersji tych pokrewnych tematów.

Przegląd

Co to jest zmiennoprzecinkowy?

Istnieją dwa rodzaje liczb:

  • stały punkt, w którym pewna liczba cyfr jest dostępna przed i za punktem radix.
  • zmiennoprzecinkowy, w którym dostępna jest pewna liczba cyfr dla mantysy i wykładnika.

Przykład użycia cyfr dziesiętnych z trzema miejscami po przecinku przed przecinkiem i dwoma miejscami po przecinku:

  • 0 byłoby reprezentowane jako 000,00
  • 0,123 oznaczono by jako 000.12
  • 0,00123 byłoby reprezentowane jako 000,00
  • 1 byłoby reprezentowane jako 001.00
  • 1.123 byłoby reprezentowane jako 001.12
  • 1,00123 byłoby reprezentowane jako 001.00
  • 123,456 byłoby reprezentowane jako 123,45
  • 1234.56 jest błędem, ponieważ byłby przechowywany jako 234,56 i to jest po prostu źle

Przykład użycia cyfr dziesiętnych z pięcioma miejscami dziesiętnymi dla mantysy i jednym miejscem dziesiętnym dla wykładnika:

  • 0 można przedstawić jako 0,00000 x 10 ^ 0
  • 0,1 można przedstawić jako .10000 x 10 ^ 0
  • 0,0000123456 można przedstawić jako .12345 x 10 ^ -4
  • 0,000000000123456 można przedstawić jako .12345 x 10 ^ -9
  • 0,00000000001 to błąd, ponieważ wykładnik nie jest wystarczająco duży, aby zapisać liczbę
  • 1 może być reprezentowany jako .10000 x 10 ^ 1
  • 1.123 może być reprezentowany jako .1212 x 10 ^ 1
  • 1,00123 może być reprezentowany jako .10012 x 10 ^ 1
  • 123,45678 można przedstawić jako .12345 x 10 ^ 2
  • 123456789,1 może być reprezentowany jako .12345 x 10 ^ 9
  • 1000000000 jest błędem, ponieważ wykładnik nie jest wystarczająco duży, aby zapisać liczbę

Liczba zmiennoprzecinkowa może więc reprezentować liczby o bardzo różnych wielkościach (0,000000000123456 i 123456789.1) z tą samą dokładnością względną.

Stałe liczby punktowe są przydatne, gdy zawsze potrzebna jest określona liczba miejsc dziesiętnych, niezależnie od wielkości liczby (na przykład pieniędzy). Liczby zmiennoprzecinkowe są przydatne, gdy wielkość zmienia się, a dokładność jest nadal potrzebna. Na przykład: dla inżyniera drogowego odległości są mierzone w metrach, a 0,01 metra jest nieznaczne, ale dla projektanta mikroczipów różnica między 0,0000001 metrów a .000000001 metrów jest ogromna - i fizyk może potrzebować dużych liczb i bardzo, bardzo małe liczby w tym samym obliczeniu. Dokładność przy wielu różnych wielkościach sprawia, że liczby zmiennoprzecinkowe są przydatne.

Jak to działa

Komputery nie używają liczb dziesiętnych - używają wartości binarnych, co powoduje problemy z liczbą zmiennoprzecinkową, ponieważ nie każda liczba dziesiętna może być reprezentowana dokładnie przez liczbę zmiennoprzecinkową, co wprowadza błędy zaokrąglania w obliczeniach.

Po wykonaniu wszystkich przykładów w systemie dziesiętnym należy zauważyć, że ponieważ są one binarne, zamiast przechowywać liczbę zmiennoprzecinkową jako sumę ułamków dziesiętnych:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

komputery przechowują liczby zmiennoprzecinkowe jako sumę ułamków binarnych:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

Istnieje wiele różnych sposobów przechowywania wzorów bitów reprezentujących te ułamki, ale ten, z którego obecnie korzysta większość komputerów, jest oparty na standardzie IEEE-754. Posiada zasady przechowywania reprezentacji dziesiętnych i binarnych oraz dla różnych typów danych wielkości.

Sposób, w jaki normalne liczby są przechowywane przy użyciu standardu IEEE, to:

  • jeden bit dla znaku - przechowywany w MSB, 1 oznacza ujemny, a 0 oznacza dodatni
  • kilka bitów dla wykładnika - odchylenie jest odejmowane, aby uzyskać zarówno wykładniki dodatnie, jak i ujemne
  • niektóre bity dla mantysy - cyfry po miejscu dziesiętnym z domyślną wartością 1 przed miejscem po przecinku.

Aby umożliwić bardziej stopniowy niedomiar, numery zdenormalizowane (gdy wszystkie bity wykładnika są zerowe) są traktowane specjalnie: wykładnik jest ustawiony na -126, a ukryte wiodące 1 przed miejscem dziesiętnym NIE jest dodawane do mantysy.

32-bitowe liczby zmiennoprzecinkowe IEEE-754

Dla normalnej 32-bitowej liczby zmiennoprzecinkowej IEEE-754:

  • bit 32 jest znakiem
  • bity 24–31 są wykładnikiem wykładniczym - odchylenie wynosi 127
  • bity 1-23 to mantysa

Tak więc normalna liczba jest obliczana jako:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

Jeśli wzór bitowy to:

0 10000101 11101111100000000000000
 

Zatem wartość wynosi:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

Istnieją pewne specjalne wartości:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

Specyfikę 32-bitowego formatu IEEE-754 można znaleźć na stronie: