Arduino-запись массива int с циклом for не работает
Я студент колледжа, поэтому я все еще многому учусь. Я столкнулся с чем-то интересным, когда делал проект. У меня есть этот сегмент кода, который работает, когда он не помещен в цикл for, но не работает, когда он есть. Я просто хочу понять, почему. Вот мой код:
void setup() {
Serial.begin(9600);
int a[8];
for(int i=0;i<8;i++) {
a[i]=pow(2,i);
}
for(int i=0;i<8;i++) {
Serial.print(a[i]);
}
}
void loop() {
}
Вот тот же код, написанный без первого цикла for (где данные записываются в массив):
void setup() {
Serial.begin(9600);
int a[8];
a[0]=pow(2,0);
a[1]=pow(2,1);
a[2]=pow(2,2);
a[3]=pow(2,3);
a[4]=pow(2,4);
a[5]=pow(2,5);
a[6]=pow(2,6);
a[7]=pow(2,7);
for(int i=0;i<8;i++) {
Serial.print(a[i]);
}
}
void loop() {
}
Первый код выводит:
1
2
3
7
15
31
63
127
В то время как второй код выходные данные:
1
2
4
8
16
32
64
128
Кто-нибудь знает? Я действительно хочу знать, почему.
1 ответ:
Вы испытываете округление с плавающей точкой. 2^4 фактически даст вам значение ближе к 15.9999, и когда это присваивается int, он усекает десятичную дробь до 15. Я бы предложил выполнять операции сдвига битов при использовании степеней 2, таких что:
for(int i=0;i<8;i++) { a[i]=(1 << i); }
Если вы хотите прочитать о сдвиге битов, посмотрите здесь. Если вы хотите узнать больше о округлении с плавающей точкой, посмотрите здесь.
Кроме того, если вы хотите просто быстро исправить свой код ближе к тому, что у вас есть, я думаю, что это также будет работать:
for(int i=0;i<8;i++) { a[i]= (int) round( pow(2, i) ); }
Это будет правильно округлять плавающий результат перед приведением его к int.