【问题标题】:Arduino - Writing int array with for loop doesn't workArduino - 用 for 循环编写 int 数组不起作用
【发布时间】:2017-06-20 20:12:06
【问题描述】:

我是一名大学生,所以我还在学习很多东西。我在做一个项目时遇到了一些有趣的事情。我有这段代码在它没有放在 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) 阅读How to Ask
  • 如果你进入嵌入式系统,更喜欢(1 &lt;&lt; i) 而不是pow(2,i)。后一个函数返回浮点数,而第一个函数通常可以翻译成一个或两个汇编语言指令。
  • 我的印象是 C 和 C++ 中的 arduino 想法。还有,对不起。这是我第一次发帖。
  • @ThomasMatthews -- 这可能是对两种方法之间差异的解释。第二个使用常量,所以对‘pow’的调用是replac d。 Y 一个转变,反过来又被优化了。第一个将变量传递给pow,因此更难优化。

标签: arduino


【解决方案1】:

您正在经历浮点舍入。 2^4 实际上会给你一个接近 15.9999 的值,当它被分配给一个 int 时,它会将小数点截断为 15。我建议在使用 2 的幂时进行位移运算,这样:

  for(int i=0;i<8;i++)
  {
    a[i]=(1 << i);
  }

如果您想了解位移,请查看here。 如果您想了解更多关于浮点四舍五入的信息,请查看here

此外,如果您只想快速修复代码,使其更接近您所拥有的,我相信这也可以:

  for(int i=0;i<8;i++)
  {
    a[i]= (int) round( pow(2, i) );
  }

这将在将浮动结果转换为 int 之前正确舍入它。

【讨论】:

  • 谢谢!当我发现这个问题时,我实际上正在学习使用 74HC595 进行移位登记。现在更有意义了
  • 你能解释一下为什么 2^4 给出的值更接近 15.9999 吗?
  • @appa yip yip 我相信这是因为标准数学库使用近似算法而不管参数的类型,所以无论你是否使用整数,你都会进行浮点计算。
  • @EastonBornmeier 哦,我明白了。谢谢你的解释:)
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2017-04-13
  • 2013-12-31
  • 2014-04-27
  • 2018-04-22
  • 2016-05-13
  • 2018-09-09
相关资源
最近更新 更多