-
-
Erfahrener Benutzer
Begeisterter Techniker
Gleitpunktrechnung auf AVR?
Moin moin,
Kurze Frage: Kann man eigentlich mit C auf AVR-Prozessoren auch Gleitpunktrechnungen durchführen, also zum Beispiel dividieren? In dem Tutorial werden irgendwie immer nur Byte und Word Variablen erwähnt, nie float oder gar double.
Nils
-
Erfahrener Benutzer
Fleißiges Mitglied
Hi Minifriese,
kleiner Auszug aus der avr-libc:
Functions
double cos (double __x) __ATTR_CONST__
double fabs (double __x) __ATTR_CONST__
double fmod (double __x, double __y) __ATTR_CONST__
double modf (double __value, double *__iptr)
double sin (double __x) __ATTR_CONST__
double sqrt (double __x) __ATTR_CONST__
double tan (double __x) __ATTR_CONST__
double floor (double __x) __ATTR_CONST__
double ceil (double __x) __ATTR_CONST__
double frexp (double __value, int *__exp)
double ldexp (double __x, int __exp) __ATTR_CONST__
double exp (double _x) __ATTR_CONST__
double cosh (double __x) __ATTR_CONST__
double sinh (double __x) __ATTR_CONST__
double tanh (double __x) __ATTR_CONST__
double acos (double __x) __ATTR_CONST__
double asin (double __x) __ATTR_CONST__
double atan (double __x) __ATTR_CONST__
double atan2 (double __y, double __x) __ATTR_CONST__
double log (double __x) __ATTR_CONST__
double log10 (double __x) __ATTR_CONST__
double pow (double __x, double __y) __ATTR_CONST__
int isnan (double __x) __ATTR_CONST__
int isinf (double __x) __ATTR_CONST__
double square (double __x) __ATTR_CONST__
double inverse (double) __ATTR_CONST__
von daher dürften die Grundrechenarten kein Problem sein
-
Erfahrener Benutzer
Begeisterter Techniker
-
Wenn du sprintf damit nutzen möchtest, dann vergiss nicht dies in dem Makefile auch zu erlauben (bei mfile einfach durchklicken).
Das kostet dann allerdings mal eben 5kB Flash, daher eben auch abschaltbar.
Und ich habe öfters in Rechnungen mit float double an normale Zahlen ".0" ranhängen muessen, damit der compiler kapiert hat, dass ich float nutzen möchte und nicht int (trotz typecast).
also:
float zahl, zahl2;
zahl = zahl2 * 5 / 6;
ging nicht, aber:
float zahl, zahl2;
zahl = zahl2 * 5.0 / 6.0;
ging! Komisch, oder?
cu joern
-
Das gehört so ...
Da handelt es sich um eine implizite Festlegung des Typs.
5 ist int, 5.0 ist float.
Eine Division durch einen int-Wert ergibt einen int-Wert, bei einer Division durch einen float-Wert kommt halt ein float-Wert raus.
Ist doch klar, oder?
-
Erfahrener Benutzer
Roboter Experte
An dieser Stelle habe ich auch noch eine Frage,
Ich möchte meinen Steuerhebelweg pwe ADC erfassen.
Dieser geht von 0 bis 1023 (10Bit):
uint16_t way_akt;
mein Steuerhebel fährt nicht den vollen Weg des Potis, daher will ich das vom LCD aus einstellen können. Quasi eine Weg-Kalibrierung.
dabei benötigt man den minimal und den maximalwert:
uint16_t way_min;
uint16_t way_max;
mein Ausgabewert, uint8_t way_steuer; ist eine 8Bit-Variable.
Das wegbegrenzen is ja ein kinderspiel:
if(way_akt<way_min){ way_akt = way_min; }
if(way_akt>way_max){ way_akt = way_max; }
so nun zum umrechnen auf 8Bit.
dazu muss beim kalibrieren ein Multiplikationsfaktor berechnet werden:
way_factor = ( way_max - way_min ) / 255;
diesen benutzt man dann zur Umrechnung:
way_steuer = way_akt / way_factor;
Das problem ist, dass der factor mindestens eine Kommastelle benötigt, um ein genaueres ergebnis zu erzielen... da der factor zwischen 3 und 6 schwankt, macht da eine kommastelle schon sehr viel an genauigkeit aus!
Ich hoffe man versteht was ich meine, und dass ihr mir helfen könnt, da ich mit double oder float nochnie was gemacht habe.
So ist es ja kein Problem mit double oder float - Dateitypen,
aber das ergebnis soll ja ein INT sein ?
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen