-         
+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Gleitpunktrechnung auf AVR?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.01.2004
    Ort
    Pottenstein
    Alter
    37
    Beiträge
    265

    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.11.2003
    Beiträge
    136
    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
    Gruß
    -=jens=-

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.01.2004
    Ort
    Pottenstein
    Alter
    37
    Beiträge
    265
    Alles klar, danke...

  4. #4
    Gast
    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

  5. #5
    roboto2
    Gast

    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?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    30
    Beiträge
    795
    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 ?
    Gruß,
    Franz

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •