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 3

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.