APPLE fallen Division

[Paul Curtis] über auf Segger eine interessante Reihe von Blog-Posts über die Berechnung Division hat. Dies ist einmal ein heißes Thema zu sein, aber heutzutage viele Computer oder Computersprachen haben Unterstützung für Multiplikation und Division eingebaut. aber einige Prozessoren nicht über die Anweisungen und eine Bibliothek tun könnte es sein, weniger als ideal. zu wissen, wie Sie Ihre eigene Rolle könnten Sie ermöglichen, für die Geschwindigkeit oder den Raum zu optimieren. Die aktuelle Rate deckt Newtons Algorithmus Teilung zu tun.

Steve Martin hatte ein berühmt wenig darüber, wie ein Millionär und nie Steuern zahlen zu sein. Er begann mit den Worten: „Erstens … eine Million Dollar erhalten. Dann …“Diese Methode ist ein bisschen so, da Sie zuerst wissen, wie zu multiplizieren, bevor Sie teilen können. Die Grundvoraussetzung ist ein zweifaches: Newton-Methode können Sie eine Schätzung eines reziproken durch aufeinanderfolgende Multiplikationen zu verfeinern und dann eine Zahl ein reziproker die gleiche wie Dividieren multipliziert wird. Mit anderen Worten, wenn wir teilen 34 um 6 müssen, können Sie umschreiben 34/6 bis 34 * 1/6 und die Antwort ist das gleiche.

Newtons Näherung für reziproke können Sie eine Vermutung auf der Antwort nehmen und verfeinern sie dann durch eine Reihe von Multiplikationen. Jede Multiplikation schafft eine bessere Genauigkeit. Sie können diese verwenden, um eine klassische Geschwindigkeit / Raum Abwägen auszuführen. Zum Beispiel, lassen sie einfach davon ausgehen, wir die gegenseitigen ein Bytes (vermutlich ein fester Punkt Byte) finden mögen. Eine Nachschlagtabelle von 256 Elementen würde perfekte Genauigkeit bieten und würde sehr schnell sein. Nicht mehr Mathematik erforderlich. aber was ist 32 Bit? jetzt der Tisch ist einfach zu groß. aber man konnte sehen, sagen, die ersten 8 Bits der 32-Bit-Zahl. Oder mehr. Oder weniger. hängt davon ab, was Ihnen wichtig ist.

So, jetzt haben Sie eine schlechte Schätzung Ihrer reziprok. Sir Issac kann es besser machen. Für einige Nummer ein, nehmen Sie Ihre Schätzung (x) und multiplizieren sie zusammen. Subtrahiert, dass die Zahl von 2 und Sie haben einen Faktor alte Schätzung zu multiplizieren, um eine neue Schätzung zu erhalten. Skipping voraus, ist es klar, ob Ihre Schätzung richtig war, würde die Multiplikation Sie 1 geben, die die alte Schätzung überhaupt nicht ändern würde. Wenn die Schätzung ausgeschaltet ist, werden Sie einen Skalierungsfaktor erhalten.

Als Formel sieht es wie folgt aus:

x = x * (2-a * x);
Wenn Sie also der Kehrwert von 22 entscheiden .02 sein könnte, wird der erste Durchgang zu folgendem Ergebnis:

* 0,02 (2-22 * 0,02) = 0,0312

* 0,0312 (2-22 * 0,0312) = 0,0410

* 0,0410 (2-22 * 0,0410) = 0,0450
Die richtige Antwort ist eine sich wiederholende dezimal 0.0454545 und wenn Sie gehen zu halten, werden Sie dort ankommen.

Natürlich, dann haben Sie zu multiplizieren ein weiteres Mal die Teilung zu tun.

Es hat uns gefallen, dass die Post eine Festkommaimplementierung hat und dann untersucht die resultierende Assembler-Code für ARM RISC-V, und dsPIC30. Es lohnt sich ein zu lesen.

Wir lieben Mathe Tricks, die wir in Assembler-Sprache verwenden können. Wenn Sie auf AVR und Floating-Point arbeiten, diese Methode nicht entgehen lassen.