我是一名大学生,所以我还在学习很多东西.我在制作项目时遇到了一些有趣的事情.我有这段代码,当它没有放在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() {
}
Run Code Online (Sandbox Code Playgroud)
这是在没有第一个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() {
}
Run Code Online (Sandbox Code Playgroud)
第一个代码输出:
1
2
3
7
15
31
63
127
Run Code Online (Sandbox Code Playgroud)
而第二个代码输出:
1
2
4
8
16
32
64
128
Run Code Online (Sandbox Code Playgroud)
有人知道吗?我真的想知道为什么.
您正在经历浮点轮回.2 ^ 4实际上会给你一个接近15.9999的值,当它被赋值为int时,它会将小数截断为15.我建议在使用2的幂时进行位移操作,这样:
for(int i=0;i<8;i++)
{
a[i]=(1 << i);
}
Run Code Online (Sandbox Code Playgroud)
如果你想了解位移,请看这里.如果您想了解有关浮点四舍五入的更多信息,请查看此处.
此外,如果您只想快速修复您的代码,我相信这也会有效:
for(int i=0;i<8;i++)
{
a[i]= (int) round( pow(2, i) );
}
Run Code Online (Sandbox Code Playgroud)
这将在将其转换为int之前正确舍入浮动结果.
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |