Salut,
ich habe gerade zwei Stunden mit einem (aus meiner Sicht) Fehler des Arduino verbracht:
Ich habe den standard blink sketch verwendet:
void loop() {
double value;
value=1000*1000;
Serial.println(value);
value = value/1000;
Serial.println(value);
value = 1000*1000/1000;
Serial.println(value);
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
und das Ergebin ist:
16960.00
16.96
16.00
Nicht ganz das, was ich mir in der Schule angeeignet habe ...
Ändere ich den Code auf
void loop() {
double value;
value=1000*1000.0;
Serial.println(value);
value = value/1000.0;
Serial.println(value);
value = 1000*1000/1000.0;
Serial.println(value);
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
erhalte ich
1000000.00
1000.00
16.96
Das heisst, dass der Compiler die Berechnung entsprechend der Argumente als Integeroperation übersetzt und sich nicht an der Typdefinition der Zielvariablen orientiert. Als Konsequenz: IMMER eine explizite Typkonversion verwenden, hier also float()
Oder mache ich einen Denkfehler? (Es ist inzwischen spät)
Ciao, Mathias