Articles

liczby zmiennoprzecinkowe

Dlaczego potrzebne są liczby zmiennoprzecinkowe

ponieważ pamięć komputera jest ograniczona, nie można przechowywać liczb z nieskończoną precyzją, bez względu na to, czy używasz ułamków binarnych, czy dziesiętnych: w pewnym momencie musisz się odciąć. Ale ile dokładności jest potrzebne? A gdzie jest to potrzebne? Ile cyfr całkowitych i ile cyfr ułamkowych?

  • dla inżyniera budującego autostradę nie ma znaczenia czy jest to 10 metrów czy 10.0001 metrów szerokości-ich pomiary prawdopodobnie nie są aż tak dokładne.
  • dla kogoś, kto projektuje mikrochip, 0,0001 metra (jedna dziesiąta milimetra) to ogromna różnica – ale nigdy nie będzie musiał radzić sobie z odległością większą niż 0,1 metra.
  • fizyk musi użyć prędkości światła (około 300000000) i stałej grawitacyjnej Newtona (około 0,000000000667) razem w tych samych obliczeniach.

aby zadowolić inżyniera i projektanta chipów, format liczb musi zapewniać dokładność liczb przy bardzo różnych wielkościach. Potrzebna jest jednak tylko względna dokładność. Aby zadowolić fizyka, musi być możliwe wykonywanie obliczeń, które obejmują liczby o różnych magnitudach.

zasadniczo posiadanie stałej liczby całkowitej i ułamkowej nie jest użyteczne – a rozwiązaniem jest format z wartością zmiennoprzecinkową.

jak działają liczby zmiennoprzecinkowe

ideą jest skomponowanie liczby z dwóch głównych części:

  • a, która zawiera cyfry liczby. Wartości ujemne oznaczają liczby ujemne.
  • wykładnik, który mówi, gdzie punkt dziesiętny (lub binarny) jest umieszczony względem początku significand. Ujemne wykładniki reprezentują liczby bardzo małe (tj. bliskie zeru).

taki format spełnia wszystkie wymagania:

  • może reprezentować liczby przy bardzo Różnych magnitudach (ograniczone długością wykładnika)
  • zapewnia taką samą względną dokładność we wszystkich magnitudach (ograniczone długością significand)
  • umożliwia obliczenia w różnych magnitudach: mnożenie bardzo dużej i bardzo małej liczby zachowuje dokładność obu w wyniku.

dziesiętne liczby zmiennoprzecinkowe zwykle przyjmują formę notacji naukowej z punktem jawnym zawsze między 1.A 2. cyfrą. Wykładnik zapisywany jest wprost wraz z podstawą, lub używa się e do oddzielenia go od significand.

standard

prawie wszystkie języki sprzętowe i programowania używają liczb zmiennoprzecinkowych w tych samych formatach binarnych, które są zdefiniowane w standardzie IEEE 754. Zwykle formaty mają długość całkowitą 32 lub 64 bity:

Format Total bits Significand bits Exponent bits Smallest number Largest number
Single precision 32 23 + 1 sign 8 ca. 1.2 ⋅ 10-38 ca. 3.4 ⋅ 1038
Double precision 64 52 + 1 sign 11 ca. 2.2 ⋅ 10-308 ca. 1.8 ⋅ 10308

zauważ, że istnieją pewne osobliwości:

  • rzeczywista Sekwencja bitów jest bitem znaku, po którym następuje wykładnik, a na końcu bity significand.
  • wykładnik nie ma znaku; zamiast tego odejmuje się od niego odchylenie wykładnika (127 dla pojedynczej i 1023 dla podwójnej precyzji). To, podobnie jak Sekwencja bitów, pozwala na poprawne porównywanie i sortowanie liczb zmiennoprzecinkowych nawet podczas ich interpretacji jako liczb całkowitych.
  • najistotniejsza cyfra significanda jest pominięta i przyjmuje się, że jest to 1, z wyjątkiem liczb podnormalnych, które są oznaczone wykładnikiem all-0 i pozwalają na zakres liczb poza najmniejszymi liczbami podanymi w powyższej tabeli, kosztem precyzji.
  • istnieją oddzielne wartości dodatnie i ujemne, różniące się bitem znaku, gdzie wszystkie pozostałe bity są równe 0. Należy je uznać za równe, mimo że ich wzorce bitowe są różne.
  • istnieją specjalne dodatnie i ujemne wartości nieskończoności, gdzie wykładnik to wszystkie 1-bity, a significand to wszystkie 0-bity. Są to Wyniki obliczeń, w których przekroczony jest dodatni zakres wykładnika, czyli dzielenie liczby regularnej przez zero.
  • istnieją specjalne wartości not a number (lub NaN), gdzie wykładnik jest wszystkimi 1-bitami, a significand nie jest wszystkimi 0-bitami. Reprezentują one wynik różnych niezdefiniowanych obliczeń (takich jak mnożenie 0 i nieskończoności, dowolne obliczenia obejmujące wartość NaN lub przypadki specyficzne dla aplikacji). Nawet identyczne bitowo wartości NaN nie mogą być uważane za równe.

Jeśli wydaje się to zbyt abstrakcyjne i chcesz zobaczyć, jak niektóre konkretne wartości wyglądają w IEEE 754, wypróbuj zabawkę Float lub wizualizację IEEE 754 lub Float Exposed.