【问题标题】:How to increment a for loop with a decimal value in C [closed]如何在C中使用十进制值增加for循环[关闭]
【发布时间】:2013-08-13 02:05:24
【问题描述】:

我有这个代码

for (k=0; k<BUFFER_LEN; k++){                

           buffer[k] = sin(2*pi*f/fs*k);          //sine generation

我的循环每次递增 1 - 因此每次计算的 k 将是 1、2、3、4、5.... 等

例如,我希望循环每次增加 0.1,所以我的正弦计算更准确? 实现这一目标的最简单方法是什么?我尝试在那个 for 循环中增加 0.1,但不认为这是允许的,因为程序超时

编辑:这是一个解决方案

int i, k;
float z=0.1;

for(i = 0; i < BUFFER_LEN; i++){                         // fill the buffer
       buffer[k] = sin(2*pi*f/fs*z);                     // sine wave value generation
       z = z + 0.1;
       }

【问题讨论】:

  • 您是否将int 增加.1 添加.1 只会让您返回相同的数字,因为截断?如果您提供SSCCE 会更有帮助。
  • 这个问题需要更多信息来了解您希望在循环结束时在buffer 中拥有什么。

标签: c loops for-loop increment


【解决方案1】:

如果您只想增加 0.1,则您的 k 值必须是浮点数。之后,就这么简单:

for(double k = 0; k < limit; k += 0.1)

但是过度使用十进制值可能会导致舍入错误,并且您的代码需要 k 为整数。这里也许是一个更好的解决方案:

for(int k = 0; k < limit * 10; k++){
    //Now, in your equation, use k/10.0
    buffer[k] = sin(2 * pi * f / fs * (k / 10.0));
}

确保buffer 的大小是所需大小的十倍!

【讨论】:

  • 你应该删除double 选项,因为缓冲区数组不能被它索引
【解决方案2】:

简单的解决方案:乘以你想要的增益

double gain = 0.1;
for (k=0; k<BUFFER_LEN; k++) {                
  buffer[k] = sin(gain * 2*pi*(f/fs)*k);          //sine generation
}

没有需要改变你的 k 循环、BUFFER_LEN 并且没有浮点问题。 1/增益不需要是整数。


您最初的问题可能是由于:

int k;
for (k=0; k<BUFFER_LEN; k += 0.1) {                
  buffer[k] = sin(2*pi*f/fs*k);          //sine generation
}

在这种情况下,k += 0.1 执行了k = (int) (k + 0.1),它将总和截断回原来的 k。因此,您的循环将永远运行。

【讨论】:

  • 是的!如此简单,我自己就应该想到这一点-是的,您是对的,如果我尝试用非整数递增,则循环将永远运行-非常感谢!
【解决方案3】:

一个天真的解决方案是:

for (double k=0; k<BUFFER_LEN/10; k+=0.1){                

           buffer[10*k] = sin(2*pi*f/fs*k);

但舍入错误可能会导致错误的结果。这就是为什么你应该在循环中使用整数运算并在循环中乘以 0.1。

我会留下这个提醒什么不要做。

【讨论】:

  • 如果k 等于例如1.1,buffer[1.1]是什么意思?
  • @Qiu:正确,已更正。
  • 如果BUFFER_LEN 是一个整数(很可能出现),BUFFER_LEN/10 将执行整数除法。示例 for (float k=0; k&lt;4/10; k+=0.1) 将迭代 0 次而不是预期的 4 次。
  • 由于舍入错误,在循环迭代中使用浮点,如此代码所做的那样,可能会超出所需的端点,并且在循环期间会增加舍入错误。迭代计数应该用整数算术来完成。
  • @EricPostpischil:谢谢。非常真实。没想到。
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2014-10-12
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多