Forum: Compiler & IDEs Dauer eine Division mit Kommazahl


von WorkMännchen (Gast)


Lesenswert?

Hallo,

wie kann man ausrechnen bzw. schätzen, wie lange eine Division von eine 
Double Zahl durch 1.002 mit 16MHz Atmega dauern würde?

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

Ich kenne den Prozessor nicht. Wenn er Hardware für die Division hat, 
dann steht das im Datenblatt. Wenn nicht, dann musst du die 
Ausführungszeit des entsprechenden Code ausrecchnen.

Alternativ kannst du messen. Du nimmst eine Reihe von vershiedenen 
Zahlen, lässt sie durch 1.002 teilen misst die Ausführungszeit und 
teilst durch die Anzahl der Zahlen.

Falls du es gerne schnell hättest, dann solltest du mit (1 / 1.002) 
multiplizieren. Geht meistens schneller.

virtuPIC

von yalu (Gast)


Lesenswert?

Da gibt es mehrere Möglichkeiten:

- Im erzeugten Assemblercode die Zyklen zählen,
- vom Simulator die Zyklen zählen lassen,
- auf realem AVR die Zyklen vom Bit-Timer/Counter zählen lassen oder
- auf realem AVR die Zeit für bspw. 100000 Divisionen mit der Stoppuhr
  messen.

Wenn es auf Geschwindigkeit ankommt, würde ich aber nicht durch 1.002
dividieren, sondern mit 1/1.002 multiplizieren.

von Oliver (Gast)


Lesenswert?

Wenn es NUR auf Geschwindigkeit ankommt, würde ich die 2 Promille 
Abweichung in Kauf nehmen, und die ganze Rechnerei sein lassen.

Oliver

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

yalu wrote:

> Wenn es auf Geschwindigkeit ankommt, würde ich aber nicht durch 1.002
> dividieren, sondern mit 1/1.002 multiplizieren.

Gute Idee... sofern das ne Konstante ist musst das dann allerdings auch 
so machen, die groesseren Megas koennen in HW multiplizieren.

Was willst denn ueberhaupt machen, vielleicht gibt es ja auch ne bessere 
Loesung.

von Tobias F. (coldtobi)


Lesenswert?

Einfach im AVR Studio simulieren.. Der zählt die Clocks, die Du 
brauchst, wenn Du den SW-Simulator nimmst.

PS: Ich hab in einem Projekt ein Polynom 3. Grades berechnet. Braucht 
ca. 250us @ 4 Mhz.

1/1.002 ist im Übrigen in Ganzzahlarith. 1, hilft also nix, der HW 
Multiplier.

von Benedikt K. (benedikt)


Lesenswert?

Ich würde einfach 1/512 von der Zahl abziehen.
Das entspricht (bis auf Rundungsfehler) der Division durch 1,001957. Der 
Fehler der dabei entsteht liegt bei 0,004%, und dürfte daher bei einer 
16bit Zahl garnicht auftauchen (außer eben als +/-1LSB Rundungsfehler).

von Jupp (Gast)


Lesenswert?

>wie kann man ausrechnen bzw. schätzen, wie lange eine Division von eine
>Double Zahl durch 1.002 mit 16MHz Atmega dauern würde?

Indem du das Programm schreibst und mit AVR Studio simulierst und die 
Anzahl der Takte abliest, fertig.

von mr.chip (Gast)


Lesenswert?

> 1/1.002 ist im Übrigen in Ganzzahlarith. 1, hilft also nix, der HW
> Multiplier.

Wenn man (nur ein wirklich kleines Stück) weiter  denkt, dann geht das 
sehr wohl: Man shiftet die zu Zahlen einfach ein bisschen nach links, so 
dass dann beispielsweise die 6 LSB Nachkommastellen darstellen.

von Gerd (Gast)


Lesenswert?

>1/1.002 ist im Übrigen in Ganzzahlarith. 1, hilft also nix

Nicht ganz. 1/1.002 ist in Ganzzahl 10000000/1002 (4 gültige Ziffern in 
1,002)

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.