Forum: Mikrocontroller und Digitale Elektronik Vorteil integer - float


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von 28B (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

auf meinen uC möchte ich in C einfache Berechnungen durchführen, die 
später extern gespeichert werden.
Ist es von Vorteil bei den Berechnungen auf Datentypen wie float und 
double zu verzichten und statdessen ein unsigned int oder unsigned long 
zu verwenden ?

Als Beispiel :    20mA + 0.002mA = 20.002 mA könnte ich auch 
folgendermaßen
rechnenn :        20000 uA + 2uA  = 20002 uA

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
naja, man sagt doch, das Float deutlich langsamer ist

von Dietrich L. (dietrichl)


Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> naja, man sagt doch, das Float deutlich langsamer ist

... was auch stimmt, wenn der µC keine "Floating Point Unit" besitzt.

von Uwe S. (de0508)


Bewertung
0 lesenswert
nicht lesenswert
@28B,

von welchem Rechenknecht schreibst Du ?

von 28B (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Noch kein bestimmter. War eher allgemein gefragt. Vermutlich ein Pic 
oder was von Renesas. M16 o.Ä

von m.n. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Tom schrieb:
> naja, man sagt doch, das Float deutlich langsamer ist

Ganz deutlich merkt man das beim Wetterbericht, wo auch mit Fließkomma 
gerechnet wird. Die Berechnungen sind so langsam, daß man erst einen Tag 
später sagen kann, wie es gestern war.
Übrigens: man sagt, daß die Erde eine Scheibe sei.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Übrigens: man sagt, daß die Erde eine Scheibe sei.
Das ist neu! Ich hatte sie bisher näherungsweise als Punkt im 
Universum betrachtet...

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Dietrich L. schrieb:
> Tom schrieb:
>> naja, man sagt doch, das Float deutlich langsamer ist
>
> ... was auch stimmt, wenn der µC keine "Floating Point Unit" besitzt.

Nicht nur Rechenzeit, sondern auch Flash wird erheblich mehr benötigt. 
Wenn von beidem genug übrig ist und die Genauigkeit reicht, spricht 
nichts gegen die Benutzung von float. Wenn man Ressourcen sparen muss, 
sollte man darauf aber eher verzichten.

von Lukas P. (lks)


Bewertung
0 lesenswert
nicht lesenswert
Bei float können dir auch folgende Fehler passieren:

Du hast eine riesige float Zahl und eine winzige float Zahl. Wenn du die 
beiden Addierst könnte es auf Grund der Endlichkeit der Mantisse 
vorkommen, dass riesige float Zahl + winzige float Zahl == riesige float 
Zahl ist (also bei der Addition sich das Ergebnis nicht von der riesigen 
float Zahl unterscheidet).

Auf der anderen Seite kann es bei Integern zu Überläufen kommen 
(riesiger signed int + Zahl == negativer signed int könnte auftreten).

Gruß

von Rolf M. (rmagnus)


Bewertung
-1 lesenswert
nicht lesenswert
m.n. schrieb:
> Tom schrieb:
>> naja, man sagt doch, das Float deutlich langsamer ist
>
> Ganz deutlich merkt man das beim Wetterbericht, wo auch mit Fließkomma
> gerechnet wird.

Fließen tut da eher der Regen, denn der ist im Gegensatz zum Komma 
tatsächlich flüssig. ;-)

> Die Berechnungen sind so langsam, daß man erst einen Tag später sagen kann,
> wie es gestern war.

Ich bin mir nicht ganz sicher, aber ich habe Zweifel, daß sie einen PIC 
für die Berechnungen einsetzen.

> Übrigens: man sagt, daß die Erde eine Scheibe sei.

Auf dem Rücken von vier Elefanten, die auf einer Schildkröte stehen?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Lukas P, schrieb:
> Bei float können dir auch folgende Fehler passieren:
Wenn man 32Bit Float gegen 32Bit Integer aufwiegt, dann kommt man zum 
Schluss, dass man mit Float Genauigkeit verliert, aber Dynamik 
gewinnt.

28B schrieb:
> Als Beispiel :    20mA + 0.002mA = 20.002 mA
Genau diese Beispiel ist für float schon grenzwertig. Weil es nur 6 
signifikante Stellen hat, wird z.B. die Rechnung 200mA+0.002mA schon 
schiefgehen (=Verlust der Genauigkeit) mit einem Integer könntest du 
über 2kA ohne Fehler auf einzelne uA abbilden.
Allerdings kannst du im selben Integer keine pA und kA darstellen. Mit 
einem Float ist das problemlos möglich: da passen 2000kA+4567kA genausa 
problemlos rein wie 0.2233fA+123nA (=große Dynamik).

Nur kannst du eben weder beim einen noch beim anderen z.B. 0.3nA+456kA 
rechnen...

: Bearbeitet durch Moderator
von 28B (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank schonmal für die ausführlichen Antworten.

von Jan H. (j_hansen)


Bewertung
0 lesenswert
nicht lesenswert
28B schrieb:
> Ist es von Vorteil bei den Berechnungen auf Datentypen wie float und
> double zu verzichten und statdessen ein unsigned int oder unsigned long
> zu verwenden ?

Brauchst du float/double? Wenn nicht (was bei dir wohl der Fall ist), 
dann würde ich Fixkomma oder Ganzzahlen wie von dir vorgeschlagen 
verwenden. Erspart Kopfschmerzen und ist auch schön flott.

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lukas P, schrieb:
> Bei float können dir auch folgende Fehler passieren:
>
> Du hast eine riesige float Zahl und eine winzige float Zahl. Wenn du die
> beiden Addierst könnte es auf Grund der Endlichkeit der Mantisse
> vorkommen, dass riesige float Zahl + winzige float Zahl == riesige float
> Zahl ist (also bei der Addition sich das Ergebnis nicht von der riesigen
> float Zahl unterscheidet).

Das ist ja schrecklich; daran habe ich ja noch garnicht gedacht.
Zum Schluß werden wir Winzlinge noch von Riesen gefressen!

28B schrieb:
> oder was von Renesas. M16 o.Ä

Wenn Du 'int' rechenen willst, dann mache es. Wenn Du 'float' brauchst, 
dann nimm 'float'.
Wenn Dein "o.Ä" ein Renesas RX62/RX63 ist, rechne 'float'. Die haben 
eine FPU intern.

von Tom (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wenn es nur um die Geschwindigkeit geht ja, aber siehe oben, 
Genauigkeit..

von DirkB (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Und wenn es geht, nimm double.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ich sehe das anders und meine: wann immer es geht nimm Integer. Und mit 
ein wenig Nach und Mitdenken klappt das erstaunlich oft...

von Differentialknilch (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Als Beispiel :    20mA + 0.002mA = 20.002 mA könnte ich auch
folgendermaßen
rechnenn :        20000 uA + 2uA  = 20002 uA


Alternativ kann amn sich ueberlegen ..

Falls die Anzeige vom Controller direkt betrieben wird, die Einheit 
nicht immer so wichtig ist. Wenn man einen Motor mit 5.234 A betreibt, 
ist das genau nur fuer den Entwickler von Interesse, dem Rest der Welt 
sagt das genau - gar nichts. Denen sagt man besser 84% Nennleistung, 
oder 3456 / 4096-tel der Nennleistung.

Oder Falls die Anzeige per Kommunikation auf dem PC geschieht, dass man 
dem PC den Umrechungsfaktor rueberschiebt, und den Rest als Integer wie 
oben kommuniziert als 3456 Einheiten Strom.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Das ist ja schrecklich; daran habe ich ja noch garnicht gedacht.
> Zum Schluß werden wir Winzlinge noch von Riesen gefressen!

Genau. Der Effekt dabei ist dann, das wir zwar weg sind, die Riesen aber 
kein bisschen satter :-)

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.