Kann mein Arduino nicht mit Kommazahlen rechnen?

Hallo,

ich habe ein seltsames Problem: Mein Arduino UNO kann nicht (mehr) mit Kommazahlen rechnen.

Hier ein Minimalbeispiel:

double test;

void setup() {
  Serial.begin(9600);
}

void loop() {

test = 800 / 1000;

Serial.println(test);

}

Ergebnis müsste ja "0.8" sein, aber im Seriellen Monitor sehe ich nur "0.00". Woran liegt das? Das interessante ist ja, dass ich mich sicher bin, dass es mal genau so funktioniert hat. Ob float oder double ist übrigens egal - gleiches Problem.

Wisst ihr vielleicht woran das liegen könnte?

Edit: Es scheint tatsächlich so, dass die Nachkommastellen nicht beachtet werden. "3/2" ergibt (ob float oder double) immer 1.00. Auch mit einem "Serial.println(test, 4);" erhalte ich dann nur ein 1.0000. Habe ich grade ein Brett vorm Kopf? Warum ist das so? :)

Schnelle Antwort: Probier mal 800.0/1000.0

Danke! Problem erstmal gelöst :)

Aber ist das ein normales Verhalten? Hätte schwören können, dass ich schonmal wie oben gerechnet habe..

naitsab113: Aber ist das ein normales Verhalten?

Ja, natürlich ist das beim Rechnen mit ganzen Zahlen ("Integer-Arithmetik") immer so: 800/1000 == 0 (Rest 800) 3/2 == 1 (Rest 1) Nachkommastellen gibt es nur beim Rechnen mit Gleitkommazahlen.

Um beim Rechnen mit einer Grundrechenart und zwei Zahlen eine Gleitkommarechnung durchzuführen, müßte mindestens eine der zur Berechnung verwendeten Zahlen eine Gleitkommazahl sein.

Aber ist das ein normales Verhalten?

Laut den ganzen mir bekannten c/C++ Spezifikationen: Ja!

Also hatte ich wirklich ein Brett vorm Kopf! Vielen Dank!!

naitsab113: Also hatte ich wirklich ein Brett vorm Kopf! Vielen Dank!!

Oder Du warst in Gedanken bei einer anderen Programmiersprache.

Bei "Visual Basic" von Microsoft ist es z.B. so, dass mit dem nach rechts fallenden Schrägstrich '/' immer eine Gleitkommadivision durchgeführt wird, auch wenn die beteiligten Zahlen als Integer dimensioniert wurden.

Bei Visual Basic müßtest Du für eine Integer-Division stattdessen den nach links fallenden Schrägstrich '\' als Divisionszeichen verwenden, dann führt VB mit den Zahlen eine Integer-Division aus.

Dagegen gibt es bei C/C++ nur den nach rechts umfallenden Schrägstrich als Divisionszeichen, und ob eine ganzzahlige Division oder eine Gleitkommadivision durchgeführt wird, hängt von den an der Berechnung beteiligten Zahlen ab. Dividierst Du zwei ganze Zahlen, ist es eine Ganzzahldivision, ist aber mindestens eine der beteiligten Zahlen eine Gleitkommazahl, wird eine Gleitkommadivision durchgeführt.

Aber das ist nicht bei jeder Programmiersprache so, siehe Visual Basic von Microsoft.