2009-09-03 28 views
6

Mam aplikację, która musi podnieść liczbę do ułamkowej mocy. Platformą docelową jest FPGA i mogę uzyskać oszacowanie wielkości FPU, ale potrzebuję algorytmu do podniesienia liczby do ułamkowej mocy tylko dla studium wykonalności. Zakładam, że zmienna punktowa jest najgorszym przypadkiem. Oczekuję, że w praktyce będziemy mogli używać skrótów, ale na razie chcę pokazać, że najgorszy możliwy przypadek może zostać zrealizowany z naszej strony.Jak obliczyć dowolną moc/root?

Myślałem, że zapytam tutaj i zobaczę, czy istnieją jakieś popularne metody, które mógłbym zrealizować. Wiem, że są na to metody programistyczne, chcę zacząć od dość skutecznego algorytmu. Martwię się o implementację FPGA.

Odpowiedz

7

Czy twój zakres wejść jest dowolny lub znany w określonym zakresie?

w obu przypadkach, x m = exp (m log x), więc jeśli możesz tworzyć funkcje do oceny exp (x) i log (x) i mnożyć, prawdopodobnie wszystko gotowe.

Będziesz musiał dowiedzieć się, jak chcesz obsłużyć nieprzypisane wartości x.

(wskazówka dla log (x): jeśli to IEEE-754 floating point razie potrzeby przesunąć mantysy, aż w końcu z zakresu liczb od 2 k i 2 k + 1 dla pewnej wartości K. Pozwala to masz do czynienia z zakresem 2: 1, który nie jest zbyt trudny do przybliżenia z wielomianami, a następnie masz po prostu niewielką liczbę możliwości poradzenia sobie z wykładnikiem i liczbą przesunięć

Odpowiednia wskazówka dla wyrażenia (x): napisz x = k + b gdzie 0 < = b < 1 i k jest liczbą całkowitą, a następnie exp (x) = exp (k) * exp (b); b ma ograniczony zasięg, a k ma ograniczoną liczbę dyskretnych możliwości.)

(wskazówka 2: liczby prawdopodobnie działa się lepiej x m = G (mf (x)) gdzie f (x) = log X i G (x) = 2 x).

+0

Zakładam, że na razie arbitralnie, muszę przeczytać trochę więcej teorii systemu, które wynikało z obliczeń. W tej chwili właśnie próbowali zaproponować klientowi rozwiązanie. Chcę tylko analitycznie udowodnić, że można to zrobić w naszym systemie. – NoMoreZealots

+0

+1. Pracowałem nad dziwnym środowiskiem uruchomieniowym, któremu brakowało pełnej biblioteki FP, ale zapewniłem procedury frexp/ldexp w celu oddzielenia i ponownego połączenia wykładnika i mantysy; z tego, budowanie standardowych funkcji FP było dość proste. –

+0

Właściwie dla jednego przypadku w szczególności wygląda na to, że wykładnik będzie> 1. Nie jestem pewien, czy ma on wartość true dla wszystkich przypadków. – NoMoreZealots

5

Jak powiedział Jason S, należy to zrobić przy użyciu tożsamości x m = exp (m log x). W praktyce jednak będziesz musiał radzić sobie z błędami obcięcia. myślę, że sposób ten jest zwykle wykonywane jest

  1. Zastosowanie Tożsamość X m = (2 n * X/2 n) m = 2 nm * (X/2 n) m i znaleźć liczbę całkowitą, tak że 1 < = x/2 n < 2.
  2. Oblicz t = log2 (x/2 n). Można to zrobić za pomocą wystarczająco wysokiego stopnia rozwinięcia Taylora lub za pomocą dobrego ola Newtona-Raphsona. Musisz upewnić się, że maksymalny błąd w przedziale [1, 2 [nie jest zbyt duży dla ciebie.
  3. Oblicz u = nm + tm.
  4. Naszym celem jest teraz obliczyć 2 u.Wykorzystują fakt, że 2 U = 2 V * 2 UV i znaleźć taki sposób, że liczba całkowita v = 0 < UV < 1.
  5. Oblicz W = 2 UV ponownie stosując nasze przyjaciela Taylora albo Newtona -Raphson. Przedział zainteresowania wynosi 0 < = u-v < 1.
  6. Twoja odpowiedź brzmi teraz 2 v * w.
+0

Jak dokładnie używasz Newton'a Raphsona do kalkulowania funkcji logu? Mogę znaleźć divison algo, używając go, ale jest zbyt dużo "szumu" na google, aby znaleźć sposób na calc logowanie za jego pomocą. – NoMoreZealots

+0

Myślę, że z mojej teorii kalkulacji pamiętam, że jest to możliwe, ale mogę się mylić. Nie jestem matematykiem. – erikkallen

+0

To samo, czego używasz do obliczenia dowolnej funkcji - jest to w zasadzie numeryczny solver dla f (x) = 0, biorąc pod uwagę parę punktów początkowych x1, x2 i gwarancję, że rozwiązanie leży pomiędzy. – qdot