2015-08-23 17 views
5

Jeśli mam tylko maszynę 32-bitową, w jaki sposób procesor oblicza liczbę podwójnej precyzji? Ta liczba ma szerokość 64 bitów. Jak radzi sobie z nim FPU?W jaki sposób 32-bitowa maszyna oblicza podwójną precyzję numer

Bardziej ogólne pytanie brzmi: jak obliczyć coś szerszego, a następnie mój alu. Jednak w pełni rozumiałem sposób integer. Możesz po prostu split je. Jednak z liczbami zmiennoprzecinkowymi masz wykładnik i mantysę, którymi należy się posługiwać w różny sposób.

+0

Jest to tylko * skomplikowany * niż int64, ale może być obsługiwany z 2 32-bitowych danych. – Jarod42

Odpowiedz

9

Nie wszystko w "maszynie 32-bitowej" musi być 32-bitowe. FPU w stylu x87 nie było "32-bitowe" od samego początku, co było bardzo długo przed utworzeniem AMD64. Zawsze był zdolny do matematyki na 80-bitowych rozszerzonych debelach, i był to osobny chip, więc nie ma szans na użycie głównej ALU w ogóle.

Jest szerszy niż ALU tak, ale nie przechodzi przez ALU, jednostki zmiennoprzecinkowe używają własnych obwodów, które są tak szerokie, jak powinny być. Te circuits są również znacznie bardziej skomplikowane niż obwody integer i nie pokrywają się z liczbami całkowitymi ALU w ich elementach.

+0

ok, tak właśnie myślałem. Albo FPU jest w stanie to zrobić, ponieważ zostało zaprojektowane z kilkoma dodatkami, albo jest wykonywane przez oprogramowanie, które rozwiązuje kompilator – hr0m

1

Nawet komputery 8-bitowe zawierały arytmetyczną zmiennoprzecinkową z dużą dokładnością (80-bitową), pisząc kod do wykonywania obliczeń.

Nowoczesne komputery 32-bitowe (x86, ARM, starsze PowerPC itp.) Mają 32-bitową liczbę całkowitą i 64- lub 80-bitowe zmiennoprzecinkowe.

+0

A co, jeśli komputer 32-bitowy ma tylko 32-bitowy sprzęt zmiennoprzecinkowy? Co wtedy? (to jest interesująca część :) – hr0m

1

Najpierw przyjrzyjmy się arytmetyce całkowitej, ponieważ jest to prostsze. Wewnątrz 32-bitowej ALU znajduje się 32 pojedynczych jednostek logicznych z bitami transportowymi, które rozleją łańcuch. 1 + 1 -> 10, przeniesienie, ale przeniesione do drugiej jednostki logicznej. Cała ALU będzie również mieć wyjściowy bit bitowy, i możesz użyć tego do zrobienia dowolnej długości matematyki. Jedynym prawdziwym ograniczeniem dla szerokości ale jest liczba bitów, z którymi można pracować w jednym cyklu. Aby zrobić 64-bitową matematykę potrzebujesz 2 lub więcej cykli i musisz wykonać logikę carry samodzielnie.

+0

tak, rozumiem to, jak już napisałem. ale jak to się robi z zmiennymi punktami? to nie takie proste, ponieważ liczba jest wewnętrznie podzielona na wykładnik i mantykę. – hr0m

+1

@ hr0m podzielisz je, następnie matematykę na significand i używając tych arbitralnych procedur precyzji. Wykładnik i znak łatwo mieszczą się w typowych typach. Trochę skomplikowane jest wykonywanie normalizacji i zaokrąglania itd., Ale można to zrobić. Zasadniczo postępuj zgodnie z algorytmem sprzętowym, ale w bardziej programowy sposób (a więc z iteracją i rozgałęzianiem). – harold

1

Wydaje się, że pytanie brzmi "jak działa FPU?", Niezależnie od szerokości bitów.

FPU wykonuje dodawanie, mnożenie, dzielenie itp. Każdy z nich ma inny algorytm.

Dodawanie

(też odejmowanie)
podawana dwa numery z wykładnik i:

  • x1 = m1 * 2^e1
  • x2 = m2 * 2^e2

, pierwszym krokiem jest normalizacja :

  • x1 = m1 * 2^e1
  • x2 = (m2 * 2^(e2 - e1)) * 2^e1 (zakładając E2> E1)

Następnie można dodać mantys:

  • x1 + x2 = (whatever) * 2^e1

Potem , należy przekonwertować wynik do prawidłowej formy mantysy/wykładnika (np. część (cokolwiek) może być wymagana powinno być między 2^23 a 2^24). To się nazywa "renormalizacja", jeśli się nie mylę. W tym miejscu należy również sprawdzić, czy nie ma przepełnienia i niedopełnienia.

Mnożenie

Wystarczy pomnożyć mantys i dodać wykładniki. Następnie zrenormalizuj pomnożone mantysy.

Division

zrobić "długi" algorytm podziału na mantys, odejmujemy wykładniki. Renormalizacja może nie być konieczna (w zależności od sposobu wdrożenia długiego podziału).

sinus/cosinus

Konwersja wejścia do przedziału [0 ... π/2], a następnie uruchomić algorytmu CORDIC na nim.

Itd

+1

nie było pytanie, czy można to zrobić w sprzęcie, nawet na 32-bitowym komputerze. Rozumiem koncepcję matematyczną. Rozumiem, jak to się robi w oprogramowaniu. Jednak dziękuję za podsumowanie – hr0m

2

Istnieje kilka różnych pojęć w architekturze komputerowej, która może być mierzona w bitach, ale żaden z nich zapobiec obsługę 64-bitowych liczb zmiennoprzecinkowych. Chociaż pojęcia te mogą być skorelowane, warto je rozważyć oddzielnie dla tego pytania.

Często "32-bitowy" oznacza, że ​​adresy mają 32 bity. Ogranicza to pamięć wirtualną każdego procesu do 2^32 adresów. Jest to miara, która powoduje najbardziej bezpośrednią różnicę w stosunku do programów, ponieważ wpływa na wielkość wskaźnika i maksymalny rozmiar danych w pamięci. Jest całkowicie nieistotny w obsłudze liczb zmiennoprzecinkowych.

Innym możliwym znaczeniem jest szerokość ścieżek, które przenoszą dane między pamięcią a procesorem. To nie jest twardy limit rozmiarów struktur danych - jeden element danych może wymagać wielu transferów. Na przykład specyfikacja języka Java nie wymaga ładunków atomowych i magazynów o wartości double lub long. Zobacz 17.7. Non-Atomic Treatment of double and long. A double może być przenoszony między pamięcią a procesorem przy użyciu dwóch oddzielnych transferów 32-bitowych.

Trzecim znaczeniem jest ogólny rozmiar rejestru. Wiele architektur używa oddzielnych rejestrów dla zmiennoprzecinkowych. Nawet jeśli rejestry ogólne mają tylko 32 bity, rejestry zmiennoprzecinkowe mogą być szersze lub możliwe jest sparowanie dwóch 32-bitowych rejestrów zmiennoprzecinkowych w celu reprezentowania jednego 64-bitowego numeru.

Typowa zależność między tymi pojęciami polega na tym, że komputer z 64-bitowymi adresami pamięci zwykle ma rejestry ogólne 64-bitowe, dzięki czemu wskaźnik może zmieścić się w jednym rejestrze uniwersalnym.

Powiązane problemy