Author Topic: Arduino kann nicht rechen ...  (Read 8693 times)

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Arduino kann nicht rechen ...
« on: October 15, 2012, 01:06:02 AM »
Salut,

ich habe gerade zwei Stunden mit einem (aus meiner Sicht) Fehler des Arduino verbracht:
Ich habe den standard blink sketch verwendet:
Code: [Select]
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:
Code: [Select]
16960.00
16.96
16.00
Nicht ganz das, was ich mir in der Schule angeeignet habe ...
Ändere ich den Code auf
Code: [Select]
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
Code: [Select]
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

microtherion

  • freakyfriday
  • Full Member
  • *
  • Posts: 163
  • Karma: +13/-0
Re: Arduino kann nicht rechen ...
« Reply #1 on: November 04, 2012, 12:07:03 AM »
Ja, Arduino verwendet die Standard C/C++ Regelnhttp://en.cppreference.com/w/cpp/language/operator_arithmetic. Vielen, auch erfahrenen, Programmierern ist es nicht bewusst, dass in C, wie in den meisten Programmiersprachen in einem Ausdruck vom Typ "a = b op c" zunächst mal b op c ohne Rücksicht auf den Typ von a ausgewertet wird (Den Typ von a zu berücksichtigen kann zu semantischen Komplikationen führen und tut letztendlich den Programmierern nicht wirklich einen Gefallen).

Natürlich ist das Ganze beim Arduino etwas auffälliger, weil viele von uns nicht mehr richtig an 16-bit integers gewohnt sind.

Nukular

  • Newbie
  • *
  • Posts: 45
  • Karma: +1/-0
Re: Arduino kann nicht rechen ...
« Reply #2 on: November 04, 2012, 06:21:12 PM »
A wife asks her husband, a computer programmer; “Could you please go to the store for me and buy one carton of milk, and if they have eggs, get 6!”
A short time later the husband comes back with 6 cartons of milk.
The wife asks him, “Why the hell did you buy 6 cartons of milk?”
He replied, “They had eggs.”

SCNR  ;)

Ich programmiere mit Klammern, damit er genau das tut, was ich möchte. Ist aber eine fiese Falle.  >:(

 

anything