什么原因导致纳米错误结果?

时间:2012-10-20 14:04:05

标签: objective-c c

我有一大堆代码通过循环运行。小写x var始终正确打印。大写X var有时正确打印,有时会打印nanjunk。为什么呢?

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

3 个答案:

答案 0 :(得分:0)

在我工作的其他语言中,&#34; NaN&#34; ({一个}除以0.0除以0.0后得到的数字。我不了解Objective-C,但它可能是相同的。

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

如果你确实有一个内存损坏错误,导致垃圾被存储到X,那么如果这些特定位都发生在1,这将导致数字打印为&#34; nan& #34;

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

答案 1 :(得分:0)

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

  
      
  • 分区0/0和±∞/±∞

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

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

  •   

(这些被称为indeterminate forms。)

检查您的代码,看看您是否正在执行任何无法获得数字答案的操作。

对于'垃圾'结果,它们可能是混乱的内存分配的结果,但你没有提供太多细节,所以我无法确定。

答案 2 :(得分:0)

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

(我也会看你的另一个问题)

编辑:我应该指出我填充了x数组的512个值 - 上面的循环只填充了10个,所以很多输入数组都没有初始化。