Problem mit pow Funktion

Ich habe ein Problem mit folgendem Sketch:

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

  int length = 10;
  
  for(int i = 0; i < length; i++){
        
        float base = pow(2, i);
        
        Serial.print(base);
        Serial.print( " == ");
        Serial.print((long) base);
        Serial.print( " == ");
        Serial.println((int) base);
  }
}

void loop() {
}

Das wird ausgegeben:

1.00 == 1 == 1
2.00 == 2 == 2
4.00 == 3 == 3
8.00 == 7 == 7
16.00 == 15 == 15
32.00 == 31 == 31
64.00 == 63 == 63
128.00 == 127 == 127
256.00 == 255 == 255
512.00 == 511 == 511

Warum stimmen die Werte ab 2^2 nicht mehr überein?

Ich kann mir das Problem absolut nicht erklären.

pow dient dazu, so Zeug wie 3.14159 ^ 0.7 auszurechnen.
Zweierpotenzen per pow werden nach dem gleichen Verfahren gebildet und sind auf einige Stellen genau, wenn du Rundung zulässt.

Wenn du eine Gleitkommazahl abschneidest, wird eben aus 3.9999997 eine 3

pow ist nunmal NICHT für zweierpotenzen.

Diese Zeile geändert:

        Serial.print(base, 10);

ergibt diese Ausgabe:

1.0000000000 == 1 == 1
2.0000000000 == 2 == 2
3.9999995231 == 3 == 3
7.9999980926 == 7 == 7
15.9999961853 == 15 == 15
31.9999885559 == 31 == 31
63.9999771118 == 63 == 63
127.9999542236 == 127 == 127
255.9999084472 == 255 == 255
511.9996337890 == 511 == 511

Nur links vom Punkt wird nach Integer übernommen.

Runde vernünftig, dann passt es auch. z.B. +0.5 und danach der Cast

Serenifly:
Runde vernünftig, dann passt es auch. z.B. +0.5 und danach der Cast

ja schon, aber die richtige Antwort ist:

2 == 1 << 1

float ist der falsche Datentyp, und pow die falsche Funktion.