Forum: Mikrocontroller und Digitale Elektronik Normierungs-Trick oder Float Berechnung?


von Marcus (Gast)


Lesenswert?

Servus,

kann mir jemand sagen was bei ca. 30 berechnungen (jeweils einmal
dividieren und addieren, also insgesamt 60 berechnungen, nacheinander)
schneller geht (ausgehend von float zahlen mit 3 nachkommastellen):

1. berechnung komplett in float durchführen und evtl daran beteiligte
integer werte auf float zwangskonvertieren

oder

2. mit "normierungs-trick" die float werte mit 1000 multiplizieren,
berechnungen durchführen und das ergebnis wieder in float wandeln

ich hoffe ihr könnt so ungefähr verstehen wie/was ich meine :-/

mfg, Marcus

PS: programmierung in C für nen Renesas M32C mit HEW

von Michael (Gast)


Lesenswert?

http://www.mikrocontroller.net/forum/read-1-315021.html#new

Noch einmal, wenn Du 'float' brauchst, dann nimm 'float'. Die
ganzen 'int' oder 'long' Optimierungen bringen eventuell ein
bißchen mehr Geschwindigkeit, was aber nicht zwingend sein muß. Bei
'long' wir mit 32 Bit gerechnet, bei 'float' jedoch nur mit 24 (für
die Mantisse), was durchaus schneller sein kann !!!
Der Vorteil von 'float': man braucht sich nicht um Rundung und
Nachkommastellen zu kümmern.

Programmier Deine Routine doch einfach einmal und messe die Laufzeit;
meines Erachtens wird sie unter 1 ms liegen. Wenn das reicht, belasse
es so. Wenn nicht, versuche die Divison mit einer 1/x Multiplikation zu
lösen; das geht u.U. schneller.

von Detlef A (Gast)


Lesenswert?

Divisionen sind extrem aufwendig und zeitraubend. Braucht man eigentlich
auch nie (ich zumindest), außer Division mit ner Konstanten, und das
machts Du mit Multiplikation/Shiften. Wenn Du Zeit hast, nimm float,
wenn nicht überleg mal, ob Du nicht um die Division rumkommst!?

Cheers
Detlef

von Marcus (Gast)


Lesenswert?

ok, danke... ich seh schon, dass muss/sollte man dann testen...

von Unbekannter (Gast)


Lesenswert?

@Marcus:

Ja, wenn Du genau für einen Prozessor schreibst, heisst die Devise bei
solchen Entscheidungen:

   Nicht raten, sondern messen.

Also, zwei Benchmarkprogramme schreiben. Dann nachschauen welcher
Algorhitmus schneller läuft, und diesen dann verwenden.

Wenn Du es ganz genau machen willst, kannst Du auch noch mit
verschiedenen Compiler-Optimierungs-Einstellungen testen. Entweder
systematisch alle Kombinationen einiger weniger Optimierungen
ausprobieren, oder mit einem genetischen Algorithmus die beste
Kombination aus einer vielzahl (alle) Optimierungsoptionen suchen
lassen.

Für die genetische Variante gibt es auch schon einige fertige Pakete
für den GCC (unter Linux/Unix). Die müsstest Du allerdings noch
anpassen dass die Zeiten auf dem Controller direkt gemessen werden
können.

Machbar ist das alles. Die Frage ist aber, lohnt sich der Aufwand?

von Marcus (Gast)


Lesenswert?

danke... glaube das lohnt wirklich nicht... denke mal ich werde es evtl
einfach einmal mit float und einmal mit integer versuchen und schauen,
ob ich was messen kann...

danke!

von Unbekannter (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.