为何输出老是出错,求助!
我写一个程序,是处理信号变换的,有一个函数,目的是看给出的周期参数是否是2的N次方,如果不是,则延长周期为其后最近的2的N次方,且相关信号量为0。
比如,我将信号周期设为3,则我输入前三个信号量为1,2,1,则输出为1,2,1,0,自动变成周期4,也就是2的2次方,第四个信号量为0。但不知为什么程序老是出错,补上的信号应为0,可是运行发现是个很大的数,请高人指点。
#include "stdafx.h "
#include "math.h "
void FFT(float a[], int M)
{
int MM;
for(int i=0;i <1000000;i++)
{
if((double)M> pow(2,(double)i))
;
else
{
MM=(int)pow(2,(double)i);
break;
}
}
for(int i=M+1;i <MM;i++)
{
a[i]=0;
}
for(int i=0;i <MM;i++)
{
printf( "a[%d] = %f\n ",i,a[i]);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
float x[100];
int N;
printf( "请输入信号的周期:\n ");
scanf( "%d ",&N);
for(int i=0;i <N;i++)
{
printf( "请输入第%d个数:\n ",i+1);
scanf( "%f ",&x[i]);
}
printf( "输入序列为:\n ");
FFT(x,N);
return 0;
}
[解决办法]
void FFT(float a[], int M)
里面
for(int i=M+1;i <MM;i++)
{
a[i]=0;
}
仔细分析你的程序,看出来当M=3时,MM=4;所以M+1=MM,那么循环就不会执行,应该把循环逻辑重新考虑,应该改为
for(int i=M;i <MM;i++)
{
a[i]=0;
}
[解决办法]
LS的正解,动作够快。。。。
for(i=M;i <MM;i++)
{
a[i]=0;
}
[解决办法]
要判断一个整数是否2的整数次方,有更简单有效的方法。相反,你的方式用了精确度不足的浮点运算,更可能有问题。
公式
x & (x + 1)
可以用来判断一个整数x是否为2的n次方减1的形式,此公式对0或各位全为1的式子都有效。例如
x = 11111(二进制)
则
x & (x + 1) = 011111 & 100000 = 0 (0值)
而若
x = 11011
则
x & (x + 1) = 11011 & 11100 = 11000 (非0)
剩下的就不多说了。
参考:《Hacker 's Delight》,2-1 Manipulating Rightmost Bits。