首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为何输出老是出错,

2012-02-16 
为何输出老是出错,求助!我写一个程序,是处理信号变换的,有一个函数,目的是看给出的周期参数是否是2的N次方

为何输出老是出错,求助!
我写一个程序,是处理信号变换的,有一个函数,目的是看给出的周期参数是否是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。

热点排行