schnelle Integer- Wurzelberechnung

Begonnen von PICkel, 09.07.2021, 18:50:11 CEST

Vorheriges Thema - Nächstes Thema

PICkel

Hallo!

Um wieder mal einen kleinen Beitrag zum Forum zu leisten, hier ein Beispiel für eine Wurzelberechnung mit ganzzahligen Variablen:

Historie: Für eine kleine CNC-Fräse habe ich eine Steuerung mit einem PIC programmiert. Zur Berechnung von Kreisbahnen bzw. deren Radien war eine schnelle Wurzelberechnung notwendig.
Da die Schrittmotorsteuerung ohnehin nur mit ganzzahligen Schritten (hier: 0,01mm/Schritt) arbeitet, ist keine Gleitkomma- Arithmetik notwendig.

Die Suche nach brauchbaren Algorithmen führte mich zu:
https://en.wikipedia.org/wiki/Methods_of_computing_square_roots

Das darin enthaltene C-Programm wurde quasi 1:1 in mikroBasic (V7.6) umgeschrieben und erfüllt alle Erfordernisse. (Leider nur als zip-Datei anfügbar.)

Im Quelltext gibt es die Funktion iWurzel(Radikant), als Eingangsparameter wird ein 32-Bit-Wert erwartet, das Ergebnis ist ein 16-Bit-Wert.

Im Hauptprogramm sind die benötigten Zeiten zwischen den NOPs angegeben.
Man sieht den Zeitunterschied zwischen Float- und Ganzzahl- Arithmetik.
Angenehmer Nebeneffekt: Ohne die sqrt()-Aufrufe mit Gleitkommaarithmetik verringert sich der Bedarf an Flash-Speicher von 3572 auf 416 Bytes.

Nachteil der Lösung: Bei kleinen Werten für das Funktionsargument kann der prozentuale Fehler des ganzzahligen Ergebnisses recht hoch sein.
Das spielte aber im Anwendungsfall keine Rolle, da selbst ein 2mm-Fräser (R=100/100mm) einen Radikant von mindestens 10000 ergibt.

MfG
PICkel

Peter


Schnellantwort

Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.

Name:
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau