2011-10-05 12 views
6

Biorąc pod uwagę dowolną liczbę reprezentowaną w formacie pojedynczej precyzji IEEE-754 (powszechnie znany jako float w niektórych językach/platformach), czy mogę być pewny, że liczba może być również dokładnie odwzorowana w formacie podwójnej precyzji?Czy wszystkie liczby o pojedynczej precyzji można reprezentować w formacie podwójnej precyzji?

Jeśli tak, czy ta właściwość jest ważna przy uwzględnieniu precyzji z dokładnością pojedynczej precyzji i podwójnej precyzji do czterokrotnej precyzji?

+0

Moje wspomnienie jest takie, że pojedyncze i podwójne różnią się tylko liczbą bitów przypisanych do mantysy/wykładnika. Jednak nie mam odniesienia, więc nie jest to odpowiedź. Ale +1, to dobre pytanie. – kdgregory

Odpowiedz

5

Tak, podwójne może reprezentować dowolną liczbę, którą może pływać. Podobnie w przypadku czterokrotnej precyzji itp.

Liczba zmiennoprzecinkowa jest reprezentowana w postaci: 1.01b x 2^-1 (w tym przypadku 0,625). Istotnymi składnikami tej liczby są significand, który jest w zasadzie liczbą binarną z punktem radix zazwyczaj tuż po pierwszej cyfrze i wykładnikiem.

Jedyna istotna różnica między binarnymi formatami zmiennoprzecinkowymi to liczba bitów dla każdego komponentu. Im więcej bitów wykorzystuje ten numer, tym więcej bitów jest dostępnych dla każdej części. Tak więc 32-bitowy "float" może mieć 1.01000000000000000000000 dla znacznika, a (64-bitowy) "double" będzie miał około 50 cyfr po kropce. Oznacza to, że każda liczba, która jest dokładnie reprezentowana w float, jest również dokładnie reprezentowana w podwójnym, ponieważ masz zarówno zwiększoną precyzję (czytaj: bardziej znaczące cyfry) i zwiększony zasięg. Jest podobny do tego, jak 64-bitowa zmienna całkowita może zawierać dowolną 32-bitową liczbę całkowitą; dodatkowe bity są po prostu nieużywane.

Oczywiście, wszystkie bity, które zostały odcięte z powodu błędu zaokrąglenia, nie powrócą do liczby po przekonwertowaniu jej na podwójny - co oznacza, że ​​masz 0,3 w float, co jest niedokładnym wynikiem, takim jak 0.2999999875 lub coś (nie mam ochoty na liczenie), nie zbliży się do 0.3, gdy skonwertujesz go na podwójne - nadal będzie to 0,2999999875. Jeśli chcesz zbliżyć się do siebie, będziesz musiał powtórzyć obliczenia za pomocą podwójnych od początku.

3

Tak. W rzeczywistości możesz uczynić jeszcze silniejsze stwierdzenie: każdy produkt dwóch liczb o pojedynczej precyzji jest reprezentowany dokładnie w podwójnej precyzji (tak samo dla połowy i pojedynczego lub podwójnego i quadowego).