2013-02-27 24 views
5

Mój program używa Math.pow() do obliczenia stosunkowo dużej podwójnej liczby do potęgi 2. Później muszę znaleźć pierwiastek kwadratowy z bardzo dużego podwójnego numer. Problem polega na tym, że muszę to zrobić ponad 100 000 razy i zajmuje to naprawdę dużo czasu. Czy jest jakaś alternatywa, która może przyspieszyć ten proces? DziękiJava - Szybsza alternatywa dla Math.pow() i Math.sqrt()

Edycja: Według dużych liczb mam na myśli od 1000 do 10000 (więc prawdopodobnie nie tak duże pod względem informatycznym). A biorąc pod uwagę, że zajmuje to dużo czasu, zajmuje około 30 sekund, aby wykonać funkcję 500 razy

+0

musisz wykonać tę samą operację dla 100 000 unikalnych numerów? – Brad

+5

Czy można zdefiniować "stosunkowo duże", "bardzo duże" i "naprawdę długie"? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

Odpowiedz

7

Jest mało prawdopodobne, aby znaleźć lepszą (szybszą) implementację niż Java Math. Możesz mieć więcej szczęścia, próbując zmienić sposób wykonywania obliczeń w swoim algorytmie. Na przykład, czy istnieje sposób na uniknięcie znalezienia pierwiastka kwadratowego z ogromnej liczby?

Jeśli to nie zadziała, możesz spróbować zastosować go w bardziej odpowiednim języku, który jest przeznaczony do szybkiego obliczeń matematycznych (coś w stylu Matlab).

W przeciwnym razie można spróbować zoptymalizować to w innych obszarach. Być może możesz spróbować buforować wcześniejsze wyniki, jeśli będą one przydatne później.

+0

Cóż, dotyczy to formuły odległości euklidesowej, więc nie mogę tego uniknąć – Matt9Atkins

+0

@ Matt9Atkins czy naprawdę potrzebujesz odległości euklidesowej? Możesz użyć jego kwadratu do porównań ... –

+0

Cóż, wciąż istnieją opcje przyspieszenia tego. Czy potrzebujesz rzeczywistego dystansu, czy tylko je porównujesz? Jeśli tylko je porównujesz, możesz uniknąć pierwiastka kwadratowego. – Oleksi

8

"Moc 2" jest kwadratowa. Lepiej rób to, mnożąc liczbę przez siebie.

Wersja biblioteki sqrt jest prawdopodobnie szybsza niż wszystko, co można znaleźć gdzie indziej. Jeśli wywołasz procedurę C, po prostu dodasz narzut z połączenia między różnymi językami. Ale czy potrzebujesz dokładnych pierwiastków kwadratowych, czy może zajrzałbyś do tabeli przybliżeń? Czy wartości często się powtarzają, tzn. Czy często trzeba obliczyć korzenie tych samych liczb? Jeśli tak, buforowanie pierwiastków kwadratowych w postaci HashMap może być szybsze niż ich obliczanie.

1

Cóż, twój problem z potęgą 2 można łatwo zrobić przez pomnożenie liczby przez siebie. Na przykład, powiedzmy, że zmienna a jest liczba chcesz podnieść do 2. To samo jak: int a=5; int b=a*a;

0

Można użyć x * x zamiast pow (x, 2).

Dla pierwiastka kwadratowego należy najpierw zapoznać się z implementacją sqrt (metoda aproksymacji).

Może uda się znaleźć lepszy, na przykład Newton's method (w równaniu sqrt (N) -x = 0).

To zależy również od potrzebnej dokładności, możesz handlować dokładnością w funkcji czasu.

Można również przechowywać wyniki, aby uniknąć wielu obliczeń na tych samych pozycjach.

+0

Z pewnością masz na myśli, że możesz użyć 'x * x' zamiast' pow (x, 2) '. I tak, na pewno lepiej jest to obliczyć jako x * x. – NovaDenizen

+0

prawo, naprawiono ... – fso

1

Jedyne, co mogę myśleć, to przechowywanie wyników dla prędkości, pierwiastek kwadratowy się nie zmieni, a ~ 9000 zapisanych liczb nie jest tak wiele. Prawdopodobnie dobrze zrobisz, aby oprawić swoje dane, abyś mógł optymalnie szukać odpowiedniego wyniku.

Powiązane problemy