PIC-Microcontroller

Elektronik u. Mikrocontroller => Codesammlung => Thema gestartet von: PICkel in 09.07.2021, 18:50:11 CEST

Titel: schnelle Integer- Wurzelberechnung
Beitrag von: PICkel in 09.07.2021, 18:50:11 CEST
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
Titel: Re: schnelle Integer- Wurzelberechnung
Beitrag von: Peter in 09.07.2021, 19:29:36 CEST
Hallo
Du kannst es aber als Quellcode hochladen.
Aber Zip ist doch ok.