2011-11-18 11 views
13

Osiągnąłem punkt w projekcie, w którym bardziej sensowne jest rozpoczęcie budowy niektórych klas pomocniczych dla wektorów i trygonometrii misc niż używanie funkcji ad-hoc. Oczekuję, że będzie tam wiele bibliotek C++, ale nie chcę rezygnować z szybkości i funkcji, do których jestem przyzwyczajony.Biblioteka C++ dla trygonometrii całkowitej, zoptymalizowana prędkość z opcjonalnymi przybliżeniami?

szczególności chcę, aby móc korzystać z kątów całkowitą, a chcę, aby utrzymać płonący prędkości zapewnionej przez przybliżeń tak:

static inline int32_t sin_approx(int32_t angle) 
//Angle is -32768 to 32767: Return -32768 to 32767 
{ 
    return (angle<<1) - ((angle*abs(angle))>>14); 
} 

Więc zanim niepotrzebnie toczyć własną rękę, czy są jakieś naprawdę szybkie biblioteki punktów stałych dla języka C++ z klasami szablonów, takimi jak wektory, w których mogę określić szerokość użytej liczby całkowitej i która ma szybkie przybliżenia, takie jak powyższa, którą powinienem obejrzeć?

+0

Jak to jest przybliżeniem grzechu? – TonyK

+0

Szczerze mówiąc, nie wiem. Napisałem go rok temu w oparciu o przybliżenie sinusoidalne przy użyciu, zgaduję, pewnej funkcji parabolicznej. Po sporze na liczbę całkowitą, powyższe wyniki. Po zapomnieniu oryginalnej funkcji nie mam pojęcia, jak to działa. Rysuje jednak prawie idealny krąg. – porgarmingduod

+2

Och, widzę to teraz. Aproksymuje on każdą połowę zakresu jako parabola z zerami o wartościach 0 i 2 oraz wartością maksymalną/minimalną +/- 1. Miły! – TonyK

Odpowiedz

4

Przeszłam tę drogę kilka lat temu, kiedy musiałam zamienić kod odcisków palców od zmiennoprzecinkowego do stałego punktu. Twardymi częściami były DCT (który wykorzystywał duży stół cosinusowy) i logarytm o wysokiej precyzji. Zaskakująco niewiele znalazłem na drodze do istniejących bibliotek. Od tego czasu słyszałem, że oryginalna konsola Sony PlayStation (PS1) nie miała wsparcia zmiennoprzecinkowego, więc fora rozwojowe (fori?), Jeśli jeszcze istnieją, mogą mieć to, czego szukasz.

Niektóre osoby, z którymi pracowałem, miały szczęście w bibliotece NewMat, chociaż są nastawione raczej na algebrę liniową niż trygonometrię i wydają się skupiać na liczbach zmiennoprzecinkowych. Mimo to, jego strona prowadzi do this list, która wydaje się warta sprawdzenia. Znalazłem także bibliotekę przetwarzania sygnałów, która może być dobra do obsługi punktów stałych. I lata temu widziałem bibliotekę szablonów przetwarzania sygnału (sptl) od Fraunhofer. Myślę, że to zastrzeżenie, ale może być jakoś dostępne.

Wszystko, co jest powiedziane, myślę, że jesteś całkiem blisko z tym, co już masz. Ponieważ masz funkcję sinus, w zasadzie masz również funkcję cosinus, pod warunkiem, że odpowiednio przekształcisz dane wejściowe (cos(x) == sin(x + pi/2)). Ponieważ styczna jest ilorazem sinusoidy i cosinusu (tan(x) = sin(x)/cos(x)), jesteś w zasadzie tam dla trygonometrii.

Jeśli chodzi o wektory, to czy klasy wektorów STAR i valarraya w połączeniu z algorytmami STL również nie są zbyt blisko? Jeśli nie, zawsze jest Boost's math libraries.

Przykro mi, nie mogę wskazać ci srebrnej kuli, której szukasz, ale to, co próbujesz zrobić, jest raczej nietypowe w dzisiejszych czasach. Ludzie, którzy chcą precyzji, zwykle przechodzą od razu do liczby zmiennoprzecinkowej, która ma przyzwoitą wydajność na nowoczesnych procesorach i wiele bibliotek. Ci, którzy chcą prędkości na sprzęcie o ograniczonych zasobach, zwykle nie potrzebują precyzji i nie robią wyzwalania przez wektor i prawdopodobnie nie robią też C++. Myślę, że najlepszym wyjściem jest rzucenie własnego. Staraj się myśleć o tym, jak zastosować wzór wzoru koła w nowym kontekście, zamiast go na nowo wymyślać. :)

+0

Bardzo dużo dobrych informacji. Jestem zszokowany widząc, że przeoczyłem bibliotekę geometrii boostu (chociaż może to i tak przesadzić) – porgarmingduod