Metoda standardowa Math.sqrt()
wydaje się już dość szybka w Javie, ale ma nieodłączną wadę, że zawsze będzie obejmowała operacje 64-bitowe, które nie ograniczają prędkości w przypadku 32-bitowych wartości float
. Czy jest to możliwe dzięki niestandardowej metodzie, która jako parametr używa parametru float
, wykonuje tylko operacje 32-bitowe i zwraca jako wynik float
?Java: 32-bitowa implementacja fp Math.sqrt()
widziałem:
Fast sqrt in Java at the expense of accuracy
i zrobił trochę więcej niż wzmacniać pogląd, że Math.sqrt() jest na ogół trudne do rytmu. Widziałem też:
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
który pokazał mi kilka ciekawych C hacki ++/ASM, że jestem po prostu zbyt nieświadomy do portu bezpośrednio do Java. Chociaż sqrt14 może być interesujący jako część połączenia JNI. . .
Spojrzałem również na Apache Commons FastMath, ale wygląda na to, że biblioteka domyślnie korzysta z standardowego Math.sqrt(), więc nie ma tam pomocy. A wtedy nie Yeppp !:
ale nie przejmowałem się tym jeszcze.
Nie jestem pewien, dostaniesz korzyści prędkości masz nadzieję, że masz –
„operacje 64-bitowe. ... nie robi nic poza zmniejszeniem prędkości w przypadku 32-bitowych wartości zmiennoprzecinkowych "jest błędem. Zasadniczo, operacje zmiennoprzecinkowe są zawsze wykonywane w precyzji FPU, a narzut zwiększa rozszerzalność i zwęża argumenty 'float' do' double', aby dopasować je do FPU. – EJP
@EJP to prawda dla 'sqrtsd' vs' sqrtss', ale oczywiście z perspektywy Java nie można tego kontrolować. Jeśli chodzi o FPU w starym stylu, który działa tak, jak opisujesz, jest w gruncie rzeczy przestarzały (i poważnie ułomny w niektórych Atomach Intel) – harold