mikrocontroller.net

Forum: Compiler & IDEs Nachkommastellen - Problem


Autor: K. Bernroithner (kobe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich schreibe gerade ein Programm bei dem ich mit sin(), cos() und acos() 
arbeite. Das funktioniert auch einwandfrei.
Das Problem ist wenn ich sehr genaue Werte brauche (Nackommastellen > 
8), wird einfach gerundet und das wirkt sich drastisch im Ergebnis aus.
Kann mir jemand sagen welchen Datentyp ich verwenden muss um noch mehr 
Nachkommastellen zum Rechnen verwenden zu können ?
(ich habs bereits mit float, double versucht, arbeite mit AVR Stdio)
Und wenn es einen Datentyp gibt bitte ich auch um die Fnuktion die man 
benötigt um ihn in einen String umzuwandeln(LCD - Display).

Ich danke schon mal im voraus und entschuldige mich für etwaige 
Anfängerfehler(bin noch im Lernen :-))

mfg kobe

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
double und float sind im AVR-GCC 32-bit-Gleitkommazahlen, die haben
eine Genauigkeit von 6...7 Stellen.

Autor: K. Bernroithner (kobe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben das ist das Problem, gibt es einen Datentyp der nch genauer ist ?
Ich kann das ganze nicht *1000, oder noch größer machen da ich ja mit 
sinus unde cosinus arbeite.

mfg kobe

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
K. Bernroithner wrote:

> Eben das ist das Problem, gibt es einen Datentyp der nch genauer ist ?
> Ich kann das ganze nicht *1000, oder noch größer machen da ich ja mit
> sinus unde cosinus arbeite.

Das brächte dich auch nicht weiter, weil bei Fliesskommarechnung die 6-7 
Stellen unabhängig von der der Position des Kommas gelten. "Fliesskomma" 
eben.

Wenn die Genauigkeit von 32bit Fliesskommarechnung nicht ausreicht, dann 
bleibt: (a) Compiler suchen, der 64bit Fliesskomma unterstützt, (b) 
eigene Funktionen fürs Rechnen entwicklen (Platz, Zeit), (c) anderen 
Controller verwenden, der 64bit lieber mag.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt noch den Typ "long double". Wenn man damit rechnet, nützt einem 
das aber nichts, weil die Bibliotheken von avr-gcc nur mit einfacher 
Genauigkeit arbeiten (also float). Ein Mikrocontroller ist halt für 
andere Aufgaben gedacht als hochpräzise Berechnungen.

Du solltest einmal schauen, ob du deinen Algorithmus nicht mit Hilfe der 
Mathematik so umformulieren kannst, dass diese begrenzte Genauigkeit 
nicht so zum Tragen kommt.

Autor: K. Bernroithner (kobe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte gehofft es gibt eine andere Möglichkeit, aber gut, dann werde ich 
mir eine deiner drei Vorschläge zu Gemüte führen :).

Danke für die schnellen Antworten kobe

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir noch dazu einfällt:
Zur Berechnung von trigonometrischen Funktionen auf µCs gibt es ein 
Verfahren namens CORDIC. Das arbeitet mit integer-Zahlen und sehr 
einfachen Operationen (Addition, Subtraktion, Shift) und ist daher sehr 
effizient. Mit long long int erreicht man damit auf dem AVR knapp 64 Bit 
Genauigkeit. (Schau mal hier: 
http://www.mikrocontroller.net/articles/AVR-CORDIC )

Autor: K. Bernroithner (kobe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe inzwischen meine Formel umgeändert (ein bisschen suchen ...) , 
sodass ich in kleinen Bereichen mit einer Näherungsformel arbeiten kann 
und erst dann wenn meine Werte größer sind auf die anfängliche Formel 
umsteige.
Umständlich aber es klappt !

Trotzdem Danke Detlev
mfg kobe

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wäre evtl. fixed point eine alternative?

mit 32 Bit also 1.31 fixed point hättest du 31 Bit für die 
Nachkommastellen.

2^-1, 2^-2, ... , 2^-31

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.