Nachkommastellen - Problem

#1038841
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
#1038868
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.
#1038870
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.
#1038970
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 )
#1039094
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren