2010-08-10 10 views
9

Próbuję lepiej zrozumieć arytmetykę zmiennoprzecinkową i widziałem kilka linków do "Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej".Jak reprezentować 0.1 w liczbach zmiennoprzecinkowych i dziesiętnych

Nadal nie rozumiem, jak liczba taka jak 0.1 lub 0.5 jest przechowywana w postaci liczb pseudonimowych i jako miejsca dziesiętne.

Czy ktoś może wyjaśnić, w jaki sposób jest ułożona to pamięć?

Wiem, że element pływający składa się z dwóch części (tj. Liczby do potęgi czegoś).

Odpowiedz

35

Zawsze wskazywałem ludzi w kierunku Harald Schmidt's online converter, wraz z Wikipedia IEEE754-1985 article z ładnymi zdjęciami.

Dla tych dwóch konkretnych wartości, można dostać (do 0,1):

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n 
0 01111011 10011001100110011001101 
      | || || || || || +- 8388608 
      | || || || || |+--- 2097152 
      | || || || || +---- 1048576 
      | || || || |+------- 131072 
      | || || || +-------- 65536 
      | || || |+----------- 8192 
      | || || +------------ 4096 
      | || |+---------------  512 
      | || +----------------  256 
      | |+-------------------  32 
      | +--------------------  16 
      +-----------------------  2 

Znak jest dodatni, to całkiem proste.

Wykładnikiem jest 64+32+16+8+2+1 = 123 - 127 bias = -4, więc mnożnik to 2-4 lub 1/16.

Mantysa jest masywna. Składa się z 1 (ukrytej podstawy) plus (dla wszystkich tych bitów, z których każda jest warta 1/(2n) jako n rozpoczyna się od 1 i wzrasta w prawo), {1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}.

Po dodaniu wszystkich tych elementów uzyskuje się 1.60000002384185791015625.

Jeśli pomnożyć przez mnożnik, masz 0.100000001490116119384765625, dlatego mówią, że nie mogą reprezentować 0.1 dokładnie jako pływaka IEEE 754 i dostarcza tyle okazji na SO dla osób odpowiadając "why doesn't 0.1 + 0.1 + 0.1 == 0.3?" pytania -Type :-)


Przykład 0,5 jest znacznie łatwiejszy. Jest reprezentowane:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 
0 01111110 00000000000000000000000 

co oznacza, że ​​jest niejawne bazowej 1, a także inne dodatki (nie wszystkie Mantysa bitów zero).

Znak jest ponownie dodatni. Wykładnikiem jest 64+32+16+8+4+2 = 126 - 127 bias = -1. Dlatego mnożnik to 2-1, który jest 1/2 lub 0.5.

Ostateczna wartość to 1 pomnożona przez 0.5 lub 0.5. Voila!


Czasami łatwiej mi było o tym myśleć w kategoriach dziesiętnych.

Liczba 1.345 odpowiada

1 + 3/10 + 4/100 + 5/1000 

lub:

 -1  -2  -3 
1 + 3*10 + 4*10 + 5*10 

Podobnie reprezentacja IEEE 754 dla dziesiętnych 0.8125 jest:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 
0 01111110 10100000000000000000000 

z domniemanym podstawy 1, które jest równoważne plik binarny:

  01111110-01111111 
1.101 * 2 

czyli

     -1 
(1 + 1/2 + 1/8) * 2  (no 1/4 since that bit is 0) 

który przedstawia się następująco:

(8/8 + 4/8 + 1/8) * 1/2 

i następnie postać:

13/8 * 1/2 = 0.8125 
2

Patrz the Wikipedia entry i the IEEE group, w pierwszej kolejności.

Zasadniczo istnieje znak, liczba i wykładnik. Liczba w jednej bazie nie może być przedstawiona w innej bazie, jeśli baza źródłowa zawiera czynniki nieobecne w bazie docelowej. Na przykład, 1/3 nie może być reprezentowana jako skończona liczba dziesiętna, ale jest trywialna do reprezentowania jako trójskładnikowa (podstawowa-3) liczba: (0.1) .

Tak 0.5 ma skończonych binarną reprezentację, (0,1) 2 , czyli 2 -1, ale 0.1 ma powtarzania reprezentacji ponieważ 2 i 10 ma współczynnik (5), ale nie w pospolity.

Powiązane problemy