C语言 什么原因导致nan错误结果?

vsnjm48y  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(447)

我有一段代码在循环中运行。小写的x var总是正确打印。大写的X var有时打印正确,有时打印nanjunk。为什么?

注意:数据始终相同。

Link to FFT
Link to FFT example usage
Link to my other SO question which shows how this is being used.获得200点奖励!

double (*x)[2];
double (*X)[2];

x =  malloc(2 * 512 * sizeof(double));
X =  malloc(2 * 512 * sizeof(double)); 

for (j = 0; j < 10; j++){
    (*x)[j] = // values inserted from method argument.; 
}

fft(512, x, X);

for (j = 0; j < 512; j++){
    if (i==512*20) {
        NSLog(@"PRE POST %f - %f",(*x)[j], (*X)[j]);
    }
}
    free(x);
    free(X);
nfeuvbwi

nfeuvbwi1#

在我工作过的其他语言中,“NaN”(不是一个数字)是当你用0.0除以0.0时得到的结果。我不知道Objective-C,但它可能是一样的。
至于是什么原因导致nan被存储在X中......在任何人回答这个问题之前,你必须向我们展示fft的主体。你说你认为这可能是一个内存/指针错误,因为它不一致。我刚刚查看了NaN在IEE 7754浮点格式中的表示方式(您的平台可能会使用)--基本上,几个高位(通常保存浮点数的指数)都必须用1填充。
如果你确实有一个内存损坏的bug,它会导致垃圾存储到X中,那么如果那些特定的位碰巧都是1,那就会导致数字打印为“nan”。
同样,请显示fft的主体,以便有人可以尝试进一步帮助您。

bvuwiixz

bvuwiixz2#

我试着运行这个程序-使用(*x)[j] = j初始化数据,并删除i==512*20打印条件。所有值都返回正常。我还尝试了随机输入数据-仍然正常。您输入数据的性质是什么?
(我也会考虑您的其他问题)
编辑:我应该指出我填充了x数组的512个值--你上面的循环只填充了10个,所以输入数组的大部分是未初始化的。

pbossiut

pbossiut3#

在浮点运算中,有几个操作会导致NaN错误。维基百科指出这些操作会导致NaN:

  • 除法0/0和±∞/±∞
  • 乘法0×±∞和±∞×0
  • 加法∞ +(−∞),(−∞)+ ∞与等价减法

(这些称为indeterminate forms。)
检查代码,查看是否正在执行任何不能得到数字答案的操作。
至于“垃圾”的结果,他们可能是混乱的内存分配的结果,但你没有提供太多的细节,所以我不能肯定。

相关问题