mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multiplikation mit Float


Autor: Günni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ist eine Umwandlung von einer float-Variablen in eine char-Variable so 
aufwendig?

Folgende Zeilen belegen fast 30% des Gesamtspeicherplatzes:

        float Faktor = 0.8;
  char wert;

  if(Servo12 >= 240)
  Servo12 = 240;

  if(Servo12 >= 129)
  {
  wert =(Servo12 -129);
  wert =(wert * Faktor);
  wert =(129 + wert);
  }

  Servo12 = wert;

Was ist da faul?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Günni wrote:
> Hi,
>
> ist eine Umwandlung von einer float-Variablen in eine char-Variable so
> aufwendig?

Ist es.

>
> Folgende Zeilen belegen fast 30% des Gesamtspeicherplatzes:

Das sagt noch gar nichts aus.
30% von 300 Byte sind 100 Byte -> nicht so arg viel
30% von 128 KByte, sind 40 KB  -> das ist heftig

>   float Faktor = 0.8;
>   char wert;
>
>   if(Servo12 >= 240)
>   Servo12 = 240;
>
>   if(Servo12 >= 129)
>   {
>   wert =(Servo12 -129);
>   wert =(wert * Faktor);

Du könntest dasselbe erreichen mit

    wert = wert * 8 / 10;

>   wert =(129 + wert);
>   }
>
>   Servo12 = wert;
>
> Was ist da faul?

Hast du den Optimizer nicht eingeschaltet?

Eine einzige Floating Point Operation führt dazu, dass
die komplette Floating Point Library mehr oder weniger
hinzugezogen wird. Und die braucht nun mal Platz.


Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floating-Point-Arithmetik ist sehr viel aufwendiger als 
Integer-Arithmetik.

Du solltest, wenn möglich, daher versuchen, FP-Arithmetik zu vermeiden.

Dein Codebeispiel scheint, wenn ich es richtig interpretiere, einen 
8-Bit-Wert in einen anderen 8-Bit-Wert umzurechnen. Dazu braucht man 
schlimmstenfalls 256 Bytes Code, nämlich eine bereits vorberechnete 
Tabelle mit allen möglichen Werten.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wär schön, wenn du mal deinen µC nennen würdest.
Aber bei einem Tiny z.B. mit wenig Flash könnte das schon sein.

Mal davon abgesehen läßt sich dein Problem mit der Skalierung
um Faktor 0.8 auch ganz leicht ohne Float-Arithmetik lösen.

Multiplizier deinen "wert" doch einfach mit 8 und teile dann durch 10.
Das geht dann ganzzahlig und deutlich resourcenschonender.

Mußt natürlich auf den Wertebereich deiner Variablen achten wenn
du multiplizierst.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3x 13:33 :-) und ich ein paar Millisekunden zu spät

Autor: Günni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!

Das mit den mal 8 und geteilt durch 10 ist auf jeden Fall ne Ecke 
besser. Frisst kaum Resourcen.

Doch was ist denn der oben angesprochene Optimizer?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Option des C-Compilers.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit
wert = wert * 205 / 256U;
sparst du auch noch die Integerdivision, wobei trotz der scheinbaren
Ungenauigkeit des Ausdrucks die gleichen Ergebnisse geliefert werden
wie bei deiner oder Karl Heinzs Lösung. Wenn für die Variable wert
auch unsigned char geht (ich kenne den Wertebereich in deiner
Anwendung nicht), wird das Programm noch einmal 4 Bytes kürzer.

Noch ein Tip, falls du das nicht sowieso schon gemacht hast: Wenn du
irgendwo tatsäschlich Floatingpoint-Berechnungen brauchst, empfiehlt
es sich, die Mathebibliothek der avr-libc zu linken (-lm), auch wenn
keine trigonometrischen oder logarithmischen Funktionen benötigt
werden. Die avr-libc enthält für die Grundrechenarten handgemachte
Assemblerfunktionen anstelle der standardmäßig verwendeten
C-Funktionen der gcclib. Das spart in deinem Beispiel, wo drei der
Funktionen benötigt werden, ca. 1,5 KB Code.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.