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
Tom schrieb: > naja, man sagt doch, das Float deutlich langsamer ist ... was auch stimmt, wenn der µC keine "Floating Point Unit" besitzt.
Noch kein bestimmter. War eher allgemein gefragt. Vermutlich ein Pic oder was von Renesas. M16 o.Ä
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.
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...
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.
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ß
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?
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
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.
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.
wenn es nur um die Geschwindigkeit geht ja, aber siehe oben, Genauigkeit..
Ich sehe das anders und meine: wann immer es geht nimm Integer. Und mit ein wenig Nach und Mitdenken klappt das erstaunlich oft...
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.