[Paul Curtis] na co Segger ma ciekawą serię blogach o obliczenia podziału. To było tematem cieplejsze, ale w dzisiejszych czasach wiele komputerów lub języki komputerowe mają wsparcie dla mnożenia i dzielenia wbudowanym. ale niektóre procesory brakuje instrukcji i bibliotekę do zrobienia może to być mniej niż idealne. wiedząc, jak się toczyć własną rękę może pozwolić na optymalizację pod kątem szybkości lub przestrzeni. Obecne okładki rata wykorzystujące algorytm Newtona zrobić podział.
Steve Martin miał słynny kawałek o tym, jak zostać milionerem i nigdy podatki zapłacić. Zaczął od stwierdzenia: „Po pierwsze … dostać milion dolarów. Potem …”Ta metoda jest trochę tak, ponieważ najpierw trzeba wiedzieć, jak wielokrotnie wcześniej można dzielić. Podstawowym założeniem jest dwojaki: metoda Newtona pozwalają udoskonalić szacunkową wzajemnej kolejnych mnożeń, a następnie pomnożenie liczby wzajemna jest taka sama jak dzielenie. Innymi słowy, jeśli musimy podzielić 34 przez 6, można przepisać 34/6 do 34 * 1/6 a odpowiedź jest taka sama.
przybliżenie Newtona dla odwrotności pozwala zgadywać na odpowiedź, a następnie oczyścić go przez serię mnożenia. Każdy mnożenie tworzy lepszą dokładność. Można to wykorzystać, aby wykonać klasyczny prędkości / Przestrzeń kompromis. Na przykład, po prostu założyć, chcemy znaleźć odwrotność bajt (przypuszczalnie stały punkt bajtów). Tabela look-up z 256 elementów zapewni doskonałą dokładność i będzie bardzo szybko. Nie więcej matematyka jest niezbędna. ale co 32 bity? Teraz tabela jest po prostu zbyt duża. ale można spojrzeć w górę, powiedzmy, pierwsze 8 bitów liczby 32-bitowej. Albo więcej. Lub mniej. zależy od tego, co jest dla Ciebie ważne.
Więc teraz masz słabe oszacowanie swojej odwrotności. Sir Issac można zrobić to lepiej. Przez jakiś numer A, zabrać swoje szacunki (x) i pomnożyć je razem. Odejmij tę liczbę od 2 i masz czynnik, aby pomnożyć swoje stare oszacowania przez dostać nową szacunkową. Pomijanie do przodu, to jest jasne, czy szacunek rację, mnożenie nie daje 1, która nie zmieni starą szacunkową wcale. Jeżeli oszacowanie jest wyłączony, dostaniesz współczynnik skalowania.
Jako wzór wygląda tak:
X = X * (2 * x-a);
Więc jeśli zdecydujesz odwrotnością 22 może być 0,02, pierwszy przebieg da Ci:
0,02 * (2-22 * 0,02) = 0,0312
0,0312 * (2-22 * 0,0312) = 0,0410
0,0410 * (2-22 * 0,0410) = 0,0450
Prawidłowa odpowiedź to ułamek dziesiętny nieskończony 0.0454545 a jeśli nie poddawać się, będziesz tam dostać.
Oczywiście potem trzeba pomnożyć jeden więcej czasu na podział.
Podobało nam się, że wpis nie zawiera implementację stałoprzecinkowych, a następnie analizuje kod wynikowy montażową dla ARM RISC, V i dsPIC30. Warto przeczytać.
Kochamy sztuczki matematyczne możemy wykorzystać w asemblerze. Jeśli pracujesz na AVR i zmiennoprzecinkowych, nie przegap tej metody.