Mam bardzo ograniczone zasoby, ponieważ pracuję z mikrokontrolerem. Czy istnieje rozszerzenie serii Taylor, wspólna tabela odnośników lub podejście rekurencyjne?
Wolałbym zrobić coś bez użycia sqrt () math.h
algorithms
c
numerical-algorithms
tarabajt
źródło
źródło
Odpowiedzi:
jeśli chcesz tanie i brudne zoptymalizowane rozszerzenie serii mocy (współczynniki dla serii Taylora zbiegają się powoli)
sqrt()
i kilka innych transcendentałów, mam trochę kodu z dawno temu. sprzedałem ten kod, ale nikt nie zapłacił mi za niego od prawie dekady. więc myślę, że wydam go do publicznego użytku. ten konkretny plik był dla aplikacji, w której procesor miał zmiennoprzecinkowy (pojedyncza precyzja IEEE-754) i mieli kompilator C i system deweloperski, ale niemają (lub nie chcieli połączyć) stdlib, który miałby standardowe funkcje matematyczne. nie potrzebowali doskonałej precyzji, ale chcieli, aby wszystko było szybkie. możesz dość łatwo odtworzyć kod, aby zobaczyć, jakie są współczynniki serii mocy i napisać własny kod. kod ten zakłada IEEE-754 i zamaskował bity dla mantysy i wykładnika.wygląda na to, że „znacznik kodu” SE jest nieprzyjazny dla znaków kąta (wiesz „>” lub „<”), więc prawdopodobnie będziesz musiał nacisnąć „edytuj”, aby zobaczyć wszystko.
źródło
stdlib
tego.Jeśli go nie widziałeś, „pierwiastek kwadratowy Quake” jest po prostu mistyczny. Wykorzystuje trochę magii na poziomie bitowym, aby dać ci bardzo dobre pierwsze przybliżenie, a następnie używa rundy lub dwóch przybliżeń Newtona, aby dokonać korekty. Może ci to pomóc, jeśli pracujesz z ograniczonymi zasobami.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
źródło
Możesz także przybliżyć funkcję pierwiastka kwadratowego za pomocą metody Newtona . Metoda Newtona jest sposobem przybliżenia, gdzie są pierwiastki funkcji. Jest to również metoda iteracyjna , w której wynik z poprzedniej iteracji jest wykorzystywany w następnej iteracji aż do konwergencji. Równanie metody Newtona do odgadnięcia, gdzie jest pierwiastek z funkcji przy początkowym zgadywaniu x 0, jest zdefiniowane jako:fa( x ) x0
Jest jednak ostrzeżenie, które powinniśmy rozważyć, patrząc na powyższe równanie. W przypadku pierwiastków kwadratowych rozwiązanie powinno być dodatnie, więc aby iteracje (i wynik) były dodatnie, należy spełnić następujący warunek:
W związku z tym:
Gdy twój tag szuka algorytmu
C
, napiszmy go bardzo szybko:Jest to dość podstawowa implementacja metody Newtona. Zauważ, że ciągle zmniejszam początkowe domysły o połowę, dopóki warunek, o którym mówiliśmy wcześniej, nie jest spełniony. Próbuję również znaleźć pierwiastek kwadratowy z 5. Wiemy, że jest to mniej więcej równa 2.236. Użycie powyższego kodu daje następujące dane wyjściowe:
Jak widać, jedyną różnicą jest to, ile iteracji jest wymaganych do obliczenia pierwiastka kwadratowego. Im większa liczba tego, co chcesz obliczyć, tym więcej iteracji zajmie.
Wiem, że ta metoda została już zasugerowana we wcześniejszym poście, ale pomyślałem, że wyprowadzę tę metodę i dostarczę trochę kodu!
źródło
tak, seria mocy może szybko i skutecznie aproksymować pierwiastek kwadratowy i tylko w ograniczonej dziedzinie. im szersza domena, tym więcej terminów będziesz potrzebować w swojej serii mocy, aby utrzymać błąd na wystarczająco niskim poziomie.
gdzie
jeśli jest zmiennoprzecinkowy, musisz oddzielić wykładnik potęgi i mantysę, tak jak robi to mój kod C w drugiej odpowiedzi.
źródło
W rzeczywistości odbywa się to przez rozwiązanie równania kwadratowego za pomocą metody Newtona:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
W przypadku liczb większych niż jeden możesz użyć następującego rozszerzenia Taylora:
http://planetmath.org/taylorexpansionofsqrt1x
źródło
W granicach 4% precyzji, jeśli dobrze pamiętam. Był używany przez inżynierów, przed linijkami logarytmicznymi i kalkulatorami. Nauczyłem się tego w Notes et formules de l'ingénieur, De Laharpe , 1923
źródło