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.
agmue
January 26, 2018, 5:34pm
3
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.