Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2024, o 16:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 25 paź 2019, o 17:49 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Witam

Czy ktoś z forumowiczów mierzył się kiedyś z problemem obliczania pierwiastka kwadratowego dla obliczeń stałoprzecinkowych (fractionali) ?
Potrzebne mi jest obliczanie pierwiastka z liczby Q9.31 optymalnie by było zrobić to bez dzielenia albo z możliwie małą liczbą dzieleń, niestety znany mi algorytm Newtona-Raphsona wymaga jednego dzielenia na każdą cyfrę wyniku. Dzielenie w moim uC wymaga 18 cykli zegara więc dla 40 znaków otrzymuje 720 instrukcji na same operacje dzielenia dla liczb 16 bitowych, a pierwiastkować będę liczby 40 bitowe więc wygląda to na całą wieczność i jeszcze trochę.
Myślałem o algorytmie cyfra po cyfrze (digit-by-digit), tyle że nie chciał bym zabrnąć w jakąś ślepą uliczkę, może ktoś już przerabiał ten problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2019, o 07:30 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Kolacz napisał(a):
Do tego jest stworzone FPU.

FPU jest stworzone do obliczeń zmiennoprzecinkowych (floating) point, mi potrzebne są obliczenia stałoprzecinkowe (fixed point).
Większość dsp pracuje na fixed point, idea polega na wykonywaniu działań na liczbach niecałkowitych, zazwyczaj na wartościach znormalizowanych. Dlatego binarnie Q0.15 i int są nie do odróżnienia, po prostu przecinek jest domniemany np. zaraz za MSB , czyli de facto wykonuje się obliczenia na int tyle, że liczby są inaczej interpretowane. Rezultatem jest tańszy procesor i niewielki spadek dokładności obliczeń przy dużej ich szybkości. Najlepsze w tym jest to, że nawet 8 bitowiec może tu dość wydajnie zasuwać z obliczeniami dla wartości znormalizowanych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2019, o 09:40 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Jaki masz zakres liczb, które chcesz pierwiastkowac i z jaką rozdzielczością i dokładnością? Może wrzucenie wyników do tablicy by Ci pomogło?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2019, o 10:36 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Pierwiastkowane liczby będą w zakresie od 0 do 0.999969482, wynik powinien zachować minimalną rozdzielczość 12b czyli krok równy 0.0000244140625 i 4096 słów w pamięci na tablice. Niestety, aż tyle miejsca nie mam w pamięci, a dołączania zewnętrznej wole uniknąć.
Może idąc Twoim tropem, spróbuję stablicować wynik zgrubnie, powiedzmy tablice 256/512 bitową co da krok 0.00390625 lub 0.001953425 i tą wartość wykorzystam jako początkową w obliczaniu pierwiastka, co powinno pozwolić na zmniejszenie liczby iteracji.
Dzięki za podsunięcie pomysłu!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2019, o 10:39 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Proszę uprzejmie :) Możesz zrobić mniej kroków a pomiędzy krokami aproksymować żeby przyspieszyć obliczanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO