Forum: Mikrocontroller und Digitale Elektronik Vorteil integer - float


von 28B (Gast)


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)


Lesenswert?

naja, man sagt doch, das Float deutlich langsamer ist

von Dietrich L. (dietrichl)


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)


Lesenswert?

@28B,

von welchem Rechenknecht schreibst Du ?

von 28B (Gast)


Lesenswert?

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

von m.n. (Gast)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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)


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)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


Lesenswert?

Vielen Dank schonmal für die ausführlichen Antworten.

von Jan H. (j_hansen)


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)


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)


Lesenswert?

wenn es nur um die Geschwindigkeit geht ja, aber siehe oben, 
Genauigkeit..

von DirkB (Gast)


Lesenswert?

Und wenn es geht, nimm double.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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)


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 :-)

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
Noch kein Account? Hier anmelden.