Hi,
welchen Datentyp wähle ich am Besten, wenn ich in einen Wertebereich zwischen 0,00 und 200,00 arbeiten möchte?
Falls man das so nicht macht, wie macht man es dann?
Gruß Chris
Hi,
welchen Datentyp wähle ich am Besten, wenn ich in einen Wertebereich zwischen 0,00 und 200,00 arbeiten möchte?
Falls man das so nicht macht, wie macht man es dann?
Gruß Chris
Für Gleitkommazahlen gibt es nur Float und Double. Welche auf dem AVR identisch sind.
Wie löst man dieses Problem dann am elegantesten? Durch umrechnen?
Gruß Chris
Welches Problem? Was willst du umrechnen? ![]()
Ich sehe das Problem zwar nicht,
aber ich würde Fixkomma in einem unsigned short int nehmen.
Also für 200,00 in dem uint16_t eine 20000 speicher. (Das Komma nach der zweiten Null "gedacht")
Ulli
wenn du nur 2 nachkommastellen brauchst kannst du auch unsigned int nehmen.
intern wird dann immer mit dem 100-fachen des Wertes gerechnet.
die Zahl 54.23 wird intern dargestellt mit
unsigned int wert = 5423;
Nur für die Ausgabe müßte das dann umgerechnet werden.
z.B.: Serial.print(wert*0.01);
Bei float musst du gar nichts rechnen:
float fwert = 54.23;
Serial.print(fwert);
guntherb:
float fwert = 54.23;
Serial.print(fwert);
Jetzt bin ich zugegebenermaßen etwas verwirrt.
Auf dieser Seite steht:
Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38.
Somit kann doch der Wert 54.23 nicht mit einem float abgebildet werden, oder doch?
Gruß Chris
Hast du das E+38 übersehen oder weißt du nicht was das bedeutet?
Das ist ein Exponent zur Basis 10.
Also 0.5423 E+2 ist 54,23
OK ?
Ulli
Bsp.:
1000 = 1 * 10³ = 1E+3
zu spät
Ah- jetzt.
Wenn ich richtig gerechnet habe, kann ich also mit einem float auch den Wert 200,00 noch abbilden.
float geht bis 2528,270282733233, oder?
Danke.
Gruß Chris
Float kann Zahlen in dieser Größenordnung abbilden aber nur auf 6 bis 7 Stellen genau.
also von 3.4028235E+38 oder anders gesagt eine Zahl mit 38 Stellen aber nur mit den ersten 6-7 genau. Das ist so weil nur eine bestimmte anzahl von bit für die Zahl und eine bestimmte anzahl bit für den exponent definiert sind.
Ich mach mal ein Beispiel im dezimalen Zahlensystem
zB Du hast 8 Zahlen als Fließkommazahl reserviert. 6 sind die Mantisse und 2 die Hochzahl. Damit kannst Du zahlen (wenn wir nur positive Zahlen berücksichtigen) von 0,00000 E00 bis 9,99999 E99.
Du kannst aber die Zahl 1,000001 nicht darstellen da für die Grundzahl nur 6 Stellen reserviert sind. Für 1,000001 bräuchtest Du 7 Stellen. Beim Arduino ist die Zahl Binär und darum kommen so krumme Max-min-Werte raus.
Also für Zahlen von 0,00 bis 200,00 sind Float-Variablen genügend genau.
Grüße Uwe
Float geht bis
340282350000000000000000000000000000000 Wenn ich mich bei den Nullen jetzt nicht
verzählt habe.
ABER ACHTUNG da wo die vielen Nullen stehen ist es ungenau !
Ulli
Halb soviel Speicher wie ein float braucht ein unsigned int. Das ist bei 8 bit Arduinos ein uint16_t .
Und kann locker Zahlen von 0 bis 20000 speichern, so dass du auch zwei Nachkommastellen hast, falls es dir darauf ankommt.