2012-10-20 79 views
1

我有这段代码运行一个循环。小写x变量始终打印正确。大写X var有时正确打印,有时打印nanjunk。为什么?什么导致nan错误结果?

N.B.数据总是相同的。

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); 
+0

这看起来不像C/Objective-C特定的问题。也许FFT没有在您试图计算的整个频谱上定义。或者它被定义但切向为0.0或无限。 –

回答

0

在其他语言中,我已经在工作,“南”(非数字),是当你通过0.0划分0.0你会得到什么。我不知道Objective-C,但它可能是相同的。

至于什么导致nan被存储在X ...你必须告诉我们fft的正文之前,任何人都可以回答这个问题。你说你认为它可能是内存/指针错误,因为它不一致。我只是在查看NaN如何用IEE 7754浮点格式表示(您的平台可能使用的) - 基本上,几个高位(通常保持浮点数的指数)都必须充满1s。

如果确实存在内存损坏问题,导致垃圾被存储到X中,那么如果这些特定位全部为1,则会导致打印数量为“nan”。

再次,请显示fft的正文,所以有人可以尝试进一步帮助您。

+0

“”nan“(不是数字)是当你将一个双倍数除以0.0时得到的结果”你正在考虑无穷大。当您将0除以0时,NaN就是您所得到的结果。 –

+0

对,谢谢......刚刚纠正了答案。 –

+0

我觉得这可能是一个记忆问题。特别是因为它有时会起作用,有时会产生垃圾。或者我的想法不正确? –

0

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

  • 的分歧0/0和±∞/±∞

  • 的乘法0×±∞和±∞×0

  • 加料∞+(-∞),(-∞)+∞和等效减法

(这些被称为indeterminate forms。)

检查您的代码以查看您是否正在执行任何不能有数字答案的操作。

至于“垃圾”结果,它们可能是内存分配混乱的结果,但你没有给出太多细节,所以我不能确定。

+0

我确实相信'NaN'和垃圾结果都是内存问题,因为该方法每次都在相同的数据上运行,但会产生不同的结果。你怎么看? –

+0

如果每次使用相同的方法都是完全相同的数据,那么我会看到其他几个选项。看着你的代码,'double(* X)[2];'和'double(* x)[2];'结合malloc(2 * 512 * sizeof(double))'看起来很奇怪。它不会创建两个512指针数组;数组(由[]'形成)是不可修改的。而当你调用'(* x)[j]'时,你正在调用例子'(* x)[510]',当你看到声明时没有任何意义。在这种情况下,我不会使用数组,结合动态内存,我认为这是造成问题的原因。 – Archimaredes

+0

如果解释有点粗糙,我很抱歉。在我研究这些之后,我可能会发布一个完整的答案。 – Archimaredes

0

我试着运行这个 - 使用(*x)[j] = j初始化数据并删除i==512*20打印条件。所有的价值都很好。我也尝试过随机输入数据 - 仍然不错。输入数据的性质是什么?

(我看你的其他问题以及)

编辑:我要指出我填补了X数组的512个值 - 你的循环以上仅填充10,那么多输入数组是未初始化。