Forum: Mikrocontroller und Digitale Elektronik ATmega128 verrechnet sich (immernoch)


von Matze N. (hupe123)


Lesenswert?

Hi!

Wenn ich in EXCEL
1
= -( (50,74218*50,74218) + (8,355147*8,355147) )
 rechne, dann kommt da raus:
1
-2644,57731254401
 alles noch gut!
Wenn mein ATmega128 das selbe machen soll kommt bei ihm raus:
1
-2644.577400000
das sieht auf den ersten Blick nicht schlimm aus. Jedoch kommen danach 
noch ein paar andere Rechenoperationen, die noch länger sind und der 
Fehler wird immergrößer....
Ich rechne übrigens in
1
float

Danke!

von Klaus W. (mfgkw)


Lesenswert?

und wie genau erwartest du in float zu rechnen?

von Klaus W. (mfgkw)


Lesenswert?


von Matze N. (hupe123)


Lesenswert?

Ich bräuchte schon so 7 Stellen nach dem Komma...

von Klaus W. (mfgkw)


Lesenswert?

Die bekommst du aber mit float nicht.
Wenn überhaupt dann mit passenden Festkommzahlen:
http://www.mikrocontroller.net/articles/Festkommaarithmetik

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Passt doch, was willste?
Wahrscheinlich rechnet Excel in double, deswegen die hoehere 
Genauigkeit. Das kannst auf nem AVR aber mal getrost vergessen.

Vielleicht waere es sinnvoll, wenn Du mal sagst, was Du vor hast und 
nicht versuchst, von Deiner suboptimalen Loesung fuer das verschwiegene 
Problem auszugehen. Das ist uebrigens in Foren immer gut ;)

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hm... Berechnung von/mit GPS-Koordinaten?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ist Matze und Daniel jetzt die selbe Person? oO"

Mein Punkt ist: Wahrscheinlich brauchst Du ueberhaupt kein Fliesskomma 
fuer die Anwendung. Bei GPS-Koordinaten, die man in Graden, Minuten und 
Sekunden angeben kann, sehr wahrscheinlich auch nicht. Im Zweifelsfall 
kann man auch noch mit Fixpunktarithmetik rechnen. Das spart ausserdem 
ne Menge Flash-Speicher auf dem AVR und laeuft um einiges schneller.

Die natuerlichen Zahlen heissen "natuerlich", weil sie von der Natur 
gegeben sind. Alles andere ist eine Erfindung der Menschen. Das sollt 
man sich klar machen an der Stelle ;)

Greets,
Michael

P.S. Das sind diese "kaum macht man es richtig, funktioniert es"-Momente 
:D

von Klaus W. (mfgkw)


Lesenswert?

Matze Niemand schrieb:
> = -( (50,74218*50,74218) + (8,355147*8,355147) )

Willst du ein Sicherheitstraining machen?
Das brauchst du bei float auch! :-)

http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=N+50%C2%B0+44.53080+E+008%C2%B0+21.30882&sll=52.975496,9.854522&sspn=0.023258,0.033903&ie=UTF8&z=16

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Michael G. schrieb:
> Ist Matze und Daniel jetzt die selbe Person? oO"

Nein, aber wie auch Klaus habe ich das als Koordinaten bei Google Maps 
eingegeben ;)

Wenn es denn um GPS geht würde ich aber sagen, dass man dort keine 
sieben Kommastellengenauigkeit benötigt, alleine die Messungenauigkeit 
sollte schon einen weitaus größeren Fehler einbringen...

von Matze N. (hupe123)


Lesenswert?

@ Klaus Wachtler: nein, die Koordinaten sind zufällig gewält, ich 
brauchte welche um meine Rechnung zu verifizieren.

@ Daniel H.: Doch, 7 Stellen nach dem Komma sind schon in meinen Augen 
wichtig! Auch wenn vielleicht sogar die letzten 2 Stellen Messfehler 
sein können, so muss man damit in der Regel bis zu Ende weiterrechnen 
und erst dann den Fehler rausziehen. Zumindest habe ich das so gelernt.


Generell habe ich mich für die Lösung mit der Festkommaarithmetik 
entschieden. Allerdings kämen bei z.B. 52, xxxxxxx° zu großer Werte 
heraus, daher wird nun erst das Delta der Koordinaten gebildet und damit 
gerechnet. Danach werden die errechneten Koordinaten dann wieder zum 
Stützvektor verschoben. So bleibt der Fehler gering und ich kann auch 
mit 7 Stellen hinter dem Komma einfach und schnell rechnen.

Grüße an alle die, die vernünfige Kommentare gebracht haben!

von Peter (Gast)


Lesenswert?

Matze Niemand schrieb:
> So bleibt der Fehler gering und ich kann auch
> mit 7 Stellen hinter dem Komma einfach und schnell rechnen.

auf einem ATmega128 kann man mit float nicht schnell rechnen, das kann 
gar nicht sein.

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Peter schrieb:
> Matze Niemand schrieb:
>> So bleibt der Fehler gering und ich kann auch
>> mit 7 Stellen hinter dem Komma einfach und schnell rechnen.
>
> auf einem ATmega128 kann man mit float nicht schnell rechnen, das kann
> gar nicht sein.

Er schrieb ja auch Festkommaarithmetik.

von Entwickler (Gast)


Lesenswert?

>auf einem ATmega128 kann man mit float nicht schnell rechnen, das kann
>gar nicht sein.

Das stimmt doch garnicht! mul und div in float werden ähnlich schnell 
gerechnet wie in 32bit int.
Es gibt auch Compiler für AVR, die double (64bit) rechnen. Der von IAR 
braucht bei 16MHz für eine double mul etwa 50-60µs.

Und dann gibt es auch Leute, die sich Mühe gegeben haben, für den AVR 
eine günstige Lösung zu stricken:
Beitrag "64 Bit float Emulator in C, IEEE754 compatibel"

von P. M. (o-o)


Lesenswert?

Peter schrieb:
> auf einem ATmega128 kann man mit float nicht schnell rechnen, das kann
> gar nicht sein.

'Schnell' gibt es nicht, nur 'schnell genug'. Für ein paar hundert 
Rechenoperationen pro Sekunde ist er auf jeden Fall schnell genug, für 
ein paar Hunderttausend auf jeden Fall nicht mehr. Alles dazwischen 
hängt von den Anforderungen ab.

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.