2017-06-08 43 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