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
double und float sind im AVR-GCC 32-bit-Gleitkommazahlen, die haben eine Genauigkeit von 6...7 Stellen.
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
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.
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.
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
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 )
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.