ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
Problem mit "pow" - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: Programmierung (/arduino-Forum-Programmierung)
+--- Thema: Problem mit "pow" (/arduino-Thread-Problem-mit-pow)

Seiten: 1 2


Problem mit "pow" - awillib - 26.02.2021 16:00

Hallo,
beim Ausprobieren des Befehls "pow" mit folgendem Sketch bin ich auf ein Problem gestoßen.
Hier der Sketch:
Code:
int pause = 500;
int wert = 0;      // Zu übertragener Wert

void setup() {
  Serial.begin(9600);
  for ( int i = 0; i < 8 ; i++)
  {
    wert = pow(2, i);
    delay(pause);
    Serial.print (wert);
    Serial.print(", ");
  }
  Serial.println("Neuanfang");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Der Serielle Monitor zeigt mir folgendes Ergebnis an:
1, 2, 3, 7 ,15, 31, 63, 127, Neuanfang
erwartet hätte ich:
1, 2, 4, 8, 16, 32, 64, 128, Neuanfang

Wenn ich die Werte für "i" direkt eingebe kommt das richtige Ergebnis.
Hat vielleicht jemand einen Tipp wo mein Fehler liegt?
Danke!
Gruß awillib


RE: Problem mit "pow" - Tommy56 - 26.02.2021 16:06

Setze Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Welcher Prozessor?

Gruß Tommy


RE: Problem mit "pow" - MicroBahner - 26.02.2021 16:10

Das Problem ist, dass Du 'wert' als int deklarierst. Da entstehen dann Feher bei der Umwandlung, denn pow gibt einen float-Wert zurück. Und da wird nicht gerundet, sondern abgeschnitten.
Wenn Du 'wert' als float deklarierst, stimmt das Ergebnis:
Code:
1.00, 2.00, 4.00, 8.00, 16.00, 32.00, 64.00, 128.00, Neuanfang

P.S. und setze deinen Code bitte zukünfitg in Code-Tags ( das # oben rechts im Editor). Oder am einfachsten in der Ide im Codefeld rechtsklicken und dann 'Für Forum kopieren' auswählen.

P.P.S Damit aus dem 'Abschneiden' eine Rundung auf ganze Zahlen wird kannst Du auch 0.5 addieren:
Code:
wert = pow(2, i) + 0.5;
dann stimmts auch mit 'int' wieder.


RE: Problem mit "pow" - awillib - 26.02.2021 17:23

Vielen Dank für die schnelle Antwort! Jetzt passt es.
Viele Grüße Wilhelm


RE: Problem mit "pow" - GuaAck - 26.02.2021 19:53

Wenn es nur um Potenzen von 2 geht, dann ist shift viel besser:

Code:
wert = 1 <<  i;

Gruß
GuaAck


RE: Problem mit "pow" - awillib - 27.02.2021 12:25

(26.02.2021 19:53)GuaAck schrieb:  Wenn es nur um Potenzen von 2 geht, dann ist shift viel besser:

Code:
wert = 1 <<  i;

Gruß
GuaAck

Danke für den Hinweis, shift habe ich bis jetzt nur für ein Lauflicht verwendet.
Ich wollte mir hier den pow Befehl näher anschauen, dazu habe ich mir nun eine LED-Leiste zusammengesteckt (Arduino Nano, Porterweiterung mit 74HC595 und 8 LED`s).
Pow() mit float zeigt jetzt zwar die richtigen Werte im seriellen Monitor an aber auf der binären Anzeige der LED-Leiste ist immer noch, ab dem zweiten Wert, der Wert um eins reduziert. Dies gilt auch für andere Basiswerte (3,4...).
Ich vermute, dass auch bei einer 7-Seg. Anzeige ein falsches Ergebnis angezeigt wird?!
Wenn man wie bereits o.a. zum Wert 0.5 od. 0.1 ect. dazu addiert stimmt die binäre Anzeige wieder.
WarumHuh??

Viele Grüße Wilhelm


RE: Problem mit "pow" - Tommy56 - 27.02.2021 12:38

z.B. 128.00 ist nicht genau 128, sondern evtl. knapp darunter (evtl. 127.99). Die 128.00 entsteht durch Rundung. Wenn Du jetzt 0.1 oder 0.5 hinzu addierst, kommt der Wert knapp über 128 (128.1) und die Umwandlung nach int schneidet einfach den Nachkommateil ab. Übrig bleibt 128.

Du kannst auch mal probieren, vor der Umwandlung nach int ein round zu machen. Damit sollte das Ergebnis auch wieder richtig sein.

Gruß Tommy


RE: Problem mit "pow" - Bitklopfer - 27.02.2021 13:47

Wenn man solche Fragen hat sollte man sich einfach mal die arduino.cc Seite mit code Referenze merken, denn da steht unter pow() das die Funktion für float Werte gemacht ist.
Zitat:base: Die Zahl. Erlaubte Datentypen: float.
lgbk