mikrocontroller.net

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


Autor: Matze Niemand (hupe123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Wenn ich in EXCEL
= -( (50,74218*50,74218) + (8,355147*8,355147) )
 rechne, dann kommt da raus:
-2644,57731254401
 alles noch gut!
Wenn mein ATmega128 das selbe machen soll kommt bei ihm raus:
-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
float

Danke!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie genau erwartest du in float zu rechnen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Matze Niemand (hupe123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bräuchte schon so 7 Stellen nach dem Komma...

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Daniel H. (Firma: keine) (commander)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... Berechnung von/mit GPS-Koordinaten?

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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&ge...

Autor: Daniel H. (Firma: keine) (commander)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matze Niemand (hupe123)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian Hoemcke (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Entwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: P. M. (o-o)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.