Forum: Mikrocontroller und Digitale Elektronik Formel in Atmel Studio 4


von Luigi A. (spok)


Lesenswert?

Hallo zusammen, wenn ich folgende Formel für die Konstante speed2ant im 
AVR schreibe, liefert diese nicht das richtige mathematische Ergebniss, 
es liefert Dec 45 es sollte aber Dec 64 liefern. Hab ich einen Fehler in 
der Syntax? :
1
.equ runden     = 4
2
.equ Schritte     = 23
3
.equ speed2ant    =(((runden*30)+Schritte)/100)*45

Danke für eure Hilfe.

Gruß

von Flo (Gast)


Lesenswert?

Beim Dividieren wird der Rest weggeschmissen.

Um das Problem zu umgehen, solltest du erst multiplizieren und dann 
dividieren.

von c-hater (Gast)


Lesenswert?

Luigi A. schrieb:

Flo hat das Wesentliche ja bereits geschrieben.

Eine Alternative zu seinem (völlig korrekten und in jedem Fall zu 
bevorzugendem) Vorschlag der sinnvollen Umstellung der Formel für 
Formel-Umstellungs-Legastheniker mag vielleicht sein, sich zu Nutze zu 
machen, dass der Assembler zur Entwurfszeit auch mit Gleitkommazahlen 
rechnen kann.

Man muss ihn nur dazu zwingen, etwa so:

.equ speed2ant    =(((30.0*runden)+Schritte)/100)*45
                        ^^das ist der Haupt-Trick

Mit ziemlicher Wahrscheinlichkeit wird es dann aber ein Warnung setzen, 
weil der Assembler erkennt, dass die so berechnete Gleitkommakonstante 
sich nicht verlustfrei auf das Integer-Symbol speed2ant reduzieren läßt. 
Um die Warnung zu unterdrücken, gibt es dann noch die nette 
Entwurfszeitfunktion Int(), mit deren Verwendung der Programmierer dem 
Assembler klar machen kann, dass er sich dieser Sachlage durchaus bewußt 
ist. Zusammen sieht das dann so aus:

.equ speed2ant    =Int((((30.0*runden)+Schritte)/100)*45)

Oder, oft (aber nicht immer) sinnvoller: mit einer tatsächlichen Rundung 
der berechneten Konstanten:

.equ speed2ant    =Int((((30.0*runden)+Schritte)/100)*45+0.5)

von Luigi A. (spok)


Lesenswert?

Danke euch für die wertvollen Tips :-). Wäre ich als unerfahrener 
Gelgenheitsprogger nie drauf gekommen.

Ich habe beides ausprobiert und beide Varianten funktionieren.
Die Variate von c-hater funktioniert aber nur wenn ich 4 Klammern 
verwende :

.equ speed2ant    =Int((((30.0*runden)+Schritte)/100)*45)
oder
.equ speed2ant    =((((30.0*runden)+Schritte)/100)*45)

wenn ich 3 Klammern verwende bleibt das falsche Ergebniss:
(((30.0*runden)+Schritte)/100)*45

Einen guten Rutsch wünsche ich euch :-)

: Bearbeitet durch User
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.