Ich sehe dann Werte wie "22.50" im Serial Monitor. Auf dem LCD ist es genauso.
Wieso wird die Float auf genau 2 Nachkommastellen ausgegeben? Woher hat das Programm die Informationen? Er könnte ja auch "22.500" schreiben.
Warum frage ich das:
Zum einen, weils mich interessiert.
Zum anderen, weil ich die zweite Nachkommastelle als überflüssig sehe. Wenn ich mit 9 Bit Auflösung einlese, dann hab ich eh nur 0,5° Schritte.
Und da reicht mir dann eine Nachkommastelle. Kann ich das meiner float beibringen, daß die nur "22,5" speichert? Und dann bei der Ausgabe ohne SPRINTF o.ä. den Wert ausgibt?
Ja genau, das ist die Lösung. Und so einfach. Und ich hab noch nie davon gehört. [SCHÄM]
Und v.a.: Funktioniert auch mit LCD-Ausgabe und auch mit client.print für den Webserver.
Schnix:
benötige um die 10 Nachkommastellen!
...
Für höhere Genauigkeit bräuchte man einen 8 Byte Floating Point Datentyp
Glaub ich nicht.
1.23456 * 10 -10 geht natürlich locker mit simplen 4 byte floats.
Das kannst du dann auch als 0.0000123456 mit 10 Nachkommastellen schreiben. Serial.print ( mySmallFloat, 10); // wenns den so unleserlich sein soll.
10 Dezimalziffern Genauigkeit brauchst du vermutlich nicht.
Mehr als 6-7 signifikante stellen sind bei 4 Byte-Float nicht drin.
Vollkommen klar, Uwe. Mir gings darum dass "ich benötige 10 Nachkommastellen" vermutlich nicht viel mit einer Genauigkeit jenseits eines float32 zu tun haben. ( ausser Schnix überzeugt mich, wofür er das braucht ).
6 bis 7 signifikante Dezimal-Stellen kann man nicht mit einem Sensor messen. Das wäre eine Genauigkeit von
0,0001 % .
Mehr als 6-7 signifikante stellen sind bei 4 Byte-Float nicht drin.
Vollkommen klar, Uwe. Mir gings darum dass "ich benötige 10 Nachkommastellen" vermutlich nicht viel mit einer Genauigkeit jenseits eines float32 zu tun haben. ( ausser Schnix überzeugt mich, wofür er das braucht ).
Die 6-7 signifikanten Stellen wiegen manche Programmierer in eine trügerische Sicherheit. Mit "float" Zahlen zu rechnen kann schon bei nur 3 signifikanten Stellen in der Zahl zu falsche Ergebnissen führen, also z.B. beim Rechnen mit einstelligen(!) Zahlen und zwei Nachkommastellen.
Anbei mal ein kleiner Test-Sketch. Mit "float" können teilweise nicht mal Zahlen unter 10 mit zwei Stellen nach dem Komma korrekt zusammengerechnet werden. Durch die interne Speicherung als "float" geht sofort Genauigkeit verloren. Und wenn man dann zwei kleine Rechenergebnisse vergleicht, kann man sich nur wundern.
Seht selbst:
// Spass mit float by 'jurs' for German Arduino forum
void setup()
{
Serial.begin(9600);
float a=1.31, b=1.62, c=1.11, d=1.82;
Serial.println("Float-Zahlen mit 2 Nachkommastellen dargestellt:");
Serial.print("a= ");Serial.println(a,2);
Serial.print("b= ");Serial.println(b,2);
Serial.print("c= ");Serial.println(c,2);
Serial.print("d= ");Serial.println(d,2);
Serial.println();
Serial.println("Dieselben Zahlen mit 8 Nachkommastellen:");
Serial.print("a= ");Serial.println(a,8);
Serial.print("b= ");Serial.println(b,8);
Serial.print("c= ");Serial.println(c,8);
Serial.print("d= ");Serial.println(d,8);
Serial.println();
if (a+b == c+d)
Serial.println("a+b ist gleich c+d");
else
Serial.println("a+b ist NICHT gleich c+d");
Serial.println();
Serial.print("a+b= ");Serial.println(a+b,8);
Serial.print("c+d= ");Serial.println(c+d,8);
}
void loop() {
}
Richtig, aber das würde mit double nicht wirklich besser
( bräuchte nur mehr Ziffern um das gleiche zu sehen),
daher ist es kein Mangel, dass ein Arduino keine double hat...
Mehr als 6-7 signifikante stellen sind bei 4 Byte-Float nicht drin.
Vollkommen klar, Uwe. Mir gings darum dass "ich benötige 10 Nachkommastellen" vermutlich nicht viel mit einer Genauigkeit jenseits eines float32 zu tun haben. ( ausser Schnix überzeugt mich, wofür er das braucht ).
6 bis 7 signifikante Dezimal-Stellen kann man nicht mit einem Sensor messen. Das wäre eine Genauigkeit von
0,0001 % .
ok, über die Notwendigkeit des Genauigkeitsextremismus läßt sich zweifeln.
Grüße Uwe
Schnix:
ich kann halt nur REF Leerzeichen und dann 7 Zahlen (incl. Dezimalpunkt) eingeben.
Ab 8 Zahlen kommt die else zum Tragen.
Wenn ich meinen String statt REF nur RE nenne sind es 8 gültige Zahlen.
Kann der serielle Monitor nur eine bestimmte String Länge einlesen?
Wenn Du mal zurückblätterst: Vor nicht allzu langer Zeit hatte ich Dir für den Sketch, um den es Dir offenbar immer noch geht, einen Democode gesendet, in dem diese Zeile mit Kommentierung drinstand:
delay(100); // warten bis alle Zeichen im Eingangspuffer
Ein delay(100) reicht bei einer Baudrate von 9600 aus, um fast 100 Zeichen einlesen zu können.
Kalkulierst Du zu knapp, funktioniert diese Art Einleseroutine nicht mehr, wenn die Eingabe zu lang wird.