Forum: Compiler & IDEs Nachkommastellen - Problem


von K. B. (kobe)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von K. B. (kobe)


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

von (prx) A. K. (prx)


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.

von Detlev T. (detlevt)


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.

von K. B. (kobe)


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

von Detlev T. (detlevt)


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 )

von K. B. (kobe)


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

von Sebastian B. (mircobolle)


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

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.