Floating point division auf 8-Bit Prozessor

OP #4515510
Moin moin,

weiß jemand zufällig wie viele Prozessorschritte eine Division von zwei 
float oder double auf einem 8-Bit-Prozessor ohne floating-point modul 
dauert?
Ich habe das Gefühl ewig, aber bevor ich mir die Mühe mache das mit dem 
Oszi auszumessen, weiß das vielleicht jemand aus dem Kopf?
Die Antworten wären bestimmt zielführender gewesen, wenn du uns verraten 
hättest, um welchen Prozessor es geht und welchen Compiler du nimmst.

Eine Suche mit Google bringt als Beispiel

I wanted to multiply two float numbers af=15343E-34 and bf=-23474E21. I 
noticed that Keil compiler generates assembly code that needs 271 Clock 
Cycles (on a Silab C8051F121, accelerated 8051) to generate the product.

Oder etwas länglicher unter

https://www.silabs.com/Support%20Documents/TechnicalDocs/CIP-51.pdf
Gast
Fabian F. schrieb:
> Ich habe das Gefühl ewig, aber bevor ich mir die Mühe mache das mit dem
> Oszi auszumessen, weiß das vielleicht jemand aus dem Kopf?

Das "ewig" kannst Du gleich wieder streichen. Auf einem 20 MHz AVR 
dauert eine fdiv() ca. 20-30 µs. Eine int32-division ist nicht unbedingt 
schneller, sodaß man ruhig bei float bleiben und die hohe Dynamik nutzen 
kann. Das hat sich allerdings noch nicht weit herumgesprochen ;-)

Bei double-Werten waren es (soweit ich mich erinnere) rund 50-70 µs mit 
einem IAR-Compiler.
m.n. schrieb:
> Eine int32-division ist nicht unbedingt
> schneller, sodaß man ruhig bei float bleiben und die hohe Dynamik nutzen
> kann.

Ist aber auch klar, die float Division setzt ja nach der Normalisierung 
auf eine Intergerdivision auf. Das bisschen schieben davo und dahinter 
machen den Kohl auch nicht fett.
Gast
Helmut L. schrieb:
> Ist aber auch klar, die float Division setzt ja nach der Normalisierung
> auf eine Intergerdivision auf. Das bisschen schieben davo und dahinter
> machen den Kohl auch nicht fett.

Mit dieser Ansicht gehörst Du aber zu einer Minderheit!
Die schreiende Mehrheit läßt selbst int32-Divisionen nicht zu - 
lediglich Schiebereien sind erlaubt ;-)
m.n. schrieb:
> Mit dieser Ansicht gehörst Du aber zu einer Minderheit!
> Die schreiende Mehrheit läßt selbst int32-Divisionen nicht zu -
> lediglich Schiebereien sind erlaubt ;-)

Die schreiende Mehrheit war wohl Einzelkind und hat nicht teilen 
gelernt, dann braucht auch ein uC es nicht zu koennen :=)
Gast
Fabian F. schrieb:
> weiß jemand zufällig..

nee, nicht zufällig.

Also: Pro Mantissenbit ist eine Subtraktion in Mantissenbreite fällig 
und ggf. eine Restrückstellung oder alternativ deren Verschiebung auf 
die nächstkleinere Stelle, was in jeder Stelle eine zusätzliche 
Fallunterscheidung oder zwei zusätzliche Sprünge erfordert. Wieviele 
Maschinentakte die Subtraktion in 24 oder 48 Bit benötigt, hängt von der 
Architektur ab. Wie gut man den Rest hinkriegt, ebenfalls.

Dazu kommt noch die anschließende Normalisierung und 
Vorzeichenberechnung und das Zusammensetzen des Ergebnisses (Exponent 
über Bytegrenze verschieben und Vorzeichen einbauen).

Die Idee mit dem Oszi oder eben random Zahlen 1000x dividieren und per 
UART debuggen wäre wohl das Beste in diesem Fall.

W.S.
OP
m.n. schrieb:
> Fabian F. schrieb:
>> Ich habe das Gefühl ewig, aber bevor ich mir die Mühe mache das mit dem
>> Oszi auszumessen, weiß das vielleicht jemand aus dem Kopf?
>
> Das "ewig" kannst Du gleich wieder streichen. Auf einem 20 MHz AVR
> dauert eine fdiv() ca. 20-30 µs. Eine int32-division ist nicht unbedingt
> schneller, sodaß man ruhig bei float bleiben und die hohe Dynamik nutzen
> kann. Das hat sich allerdings noch nicht weit herumgesprochen ;-)
>
> Bei double-Werten waren es (soweit ich mich erinnere) rund 50-70 µs mit
> einem IAR-Compiler.

Danke, wir verwenden auch IAR-Compiler, allerdings auf einem 8MHz-µC 
d.h. beim double komme ich dann schon so auf 150µs. Bei 6 
double-berechnungen pro Durchgang komme ich dann also schon auf 0,8ms, 
was sich mit den sporadischen Jitter-Phänomen im 1-ms-Timer decken 
würde.

Die Idee wäre es aud Uint64 umzusteigen und damit die Division komplett 
zu umgehen. Der Skalierungsfaktor ist dann immer >1, sprich 
Multiplikation...
Gast
Fabian F. schrieb:
> Die Idee wäre es aud Uint64 umzusteigen und damit die Division komplett
> zu umgehen. Der Skalierungsfaktor ist dann immer >1, sprich
> Multiplikation...

Entschuldige, aber das macht doch die ganze Diskussion überflüssig, 
natürlich verwendet man bei festen Werten immer eine Multiplikation 
anstelle der Division. Bei der Umwandlung z.B. von inch in cm durch 2,54 
zu dividieren ist ein unverzeihlicher Kunstfehler, selbstverständlich 
multipliziert man da mit dem Kehrwert von 2,54.

Georg
Gast
Fabian F. schrieb:
>> Bei double-Werten waren es (soweit ich mich erinnere) rund 50-70 µs mit
>> einem IAR-Compiler.
>
> Danke, wir verwenden auch IAR-Compiler, allerdings auf einem 8MHz-µC
> d.h. beim double komme ich dann schon so auf 150µs.

Dann habe ich mich ja richtig erinnert.

Georg schrieb:
> Bei der Umwandlung z.B. von inch in cm durch 2,54
> zu dividieren ist ein unverzeihlicher Kunstfehler, selbstverständlich
> multipliziert man da mit dem Kehrwert von 2,54.

Wenn ich mit 2,54 multiplizieren will, dann mache ich das auch so. Ich 
bin doch nicht der Sklave meines µC!
W.S. schrieb:
> Die Idee mit dem Oszi oder eben random Zahlen 1000x dividieren und per
> UART debuggen wäre wohl das Beste in diesem Fall.

Warum so umständlich.
Einfach die Aufrufe mit nem HW-Timer messen und dann ne Weile durch den 
Simulator rasseln lassen. Min, Max, Mittelwert legt man in Variablen ab.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.