2017-06-08 42 views
1

我有以下代码:-1#Q0显示了随机

float w[n][n] = { 
    {0, 0, 0.5, -1, 0, 0, 0}, 
    {0, 0, 1.5, -2, 0, 0, 0}, 
    {0, 0, 0, 0, 1, -1, 0}, 
    {0, 0, 0, 0, 3, -4, 0}, 
    {0, 0, 0, 0, 0, 0, 1}, 
    {0, 0, 0, 0, 0, 0, -3} 
}; 
float x[ne] = {2, -1}; 
float d = 1; 
float alpha = 0.1; 
float in[n]; 
float delta[n]; 
float a[n]; 
float sum; 

for(j = ne; j <= n; j++) { 
    for(i = 0; i <= n; i++) { 
     in[j] += w[i][j] * a[i]; 
    } 
    a[j] = g(in[j]); 
} 

for(i = 0; i < n; i++) { 
    printf("a[%d] = %.3f\n", i+1, a[i]); 
} 

delta[n-1] = d - a[n-1]; 

for(i = n-2; i >= ne; i--) { 
    for(j = 0; j <= n; j++) { 
     sum += w[i][j] * delta[j]; 
    } 
    delta[i] = g(in[i]) * (1 - g(in[i])) * sum; 
    printf("delta[%d] = %.3f\n", i+1, delta[i]); 
    sum = 0; 
} 

printf("\n\n"); 

for(i = 0; i < n; i++) { 
    for(j = 0; j < n; j++) { 
     if (w[i][j] != 0) { 
      w[i][j] = w[i][j] + alpha * a[i] * delta[j]; 
      printf("w[%d][%d] = %.3f\n", i+1, j+1, w[i][j]); 
     } 
    } 
} 

我不断收到此输出的一些变化:

a[1] = 2.000 
a[2] = -1.000 
a[3] = 0.378 
a[4] = 0.500 
a[5] = 0.867 
a[6] = 0.085 
a[7] = 0.649 

delta[6] = -1.#QO 
delta[5] = -1.#QO 
delta[4] = -1.#QO 
delta[3] = -1.#QO 

w[1][3] = -1.#QO 
w[1][4] = -1.#QO 
w[2][3] = -1.#QO 
w[2][4] = -1.#QO 
w[3][5] = -1.#QO 
w[3][6] = -1.#QO 
w[4][5] = -1.#QO 
w[4][6] = -1.#QO 
w[5][7] = 1.030 
w[6][7] = -2.997 

它在不同的地方,每次我编译显示出来,知道第一次给我正确的答案,我不确定哪里出了问题?

+0

提示:总和,定义和初始化[]' – chux

+0

https://stackoverflow.com/questions/5939573/what-float-value-makes-sprintf-s-produce-1-qo –

+0

这是一个使用gdb的绝好机会。 – Perennial

回答

2

该代码不完整。你为什么不把声明全部隐藏掉?因为他们“不重要?”

请注意,这些声明是重要的

我不能说,但我预测d未设置为0,并从堆栈中拾取0xFFFFFFFF。这不是浮点数。计算中的NaN值总是会导致NaN结果。

+0

我更新了帖子的声明 – mari

+0

这是'总和'没有设置为0,谢谢! – mari