2017-10-19 76 views
-1

首先這是一個班級任務,所以我會很感激幫助,但只是提示,因爲我想學習。我必須計算我的代碼中看到的最終數字,但是我的計算結果有些問題。我的輸出是nan,我認爲這不是一個數字。我一直在試圖弄清楚我哪裏會出錯是無濟於事的,對於如何解決這個問題有什麼建議?提前致謝。當我運行我的代碼時出現NaN錯誤

#include <iostream> 
#include <cstdlib> 
#include<stdio.h> 
#include<cmath> 

using namespace std; 

int main(){ 
int say; 
float iten_paket[100],daxil_olan_paket[100]; 
float P_B[100]; // Itmis paketlerin ehtimali = P(B) 
float P_S[100]; // Her bir serverin secilme ehtimali = P(Si) 
float sum=0,final[100],A[100]; 
cout<<"Please enter server number => "; 
cin>>say; 

for(int k = 1; k<=say; k++){ 
    cout<<"Please enter the taken packet number for : "<<k<<" server "; 
    cin>>daxil_olan_paket[k]; 
    cout<<"Please enter the lost packet number for : "<<k<<" server "; 
    cin>>iten_paket[k]; 
} 
// Her serverin secilmey ehtimali tapilir, P(S 1,2,3.....n) 
for(int i = 1; i<=say; i++){ 

    P_S[i] = 1/say; 
} 
for(int c = 1; c<=say; c++){ 

    P_B[c] = iten_paket[c]/daxil_olan_paket[c]; 
} 
for(int d = 1; d<=say; d++){ 

    A[d] = P_S[d]*P_B[d]; 
} 
for(int f = 1; f<=say; f++){ 

    sum=sum+A[f]; 
} 

// Bayes dusturu P(Sn|B) = P(B|Sn)*P(Sn)/P(B) 

for(int a = 1; a<=say; a++){ 
    final[a] =(float) A[a]/sum; 
    cout<<"For server "<<a<<" probability is :"<<final[a]<<endl; 
} 

return 0; 

}

+0

你有沒有爲任何'daxil_olan_paket'元素輸入0?你除以此。 –

+1

當你用你的調試器遍歷你的代碼時,一次一行,你的調試器說的是產生你的'NaN'的計算參數? –

+0

請輸入服務器號碼=> 3 請輸入以下服務器的接收包號碼:1服務器20 請輸入丟失的包裹號碼:1服務器1 請輸入以下服務器的接收包號碼:2服務器30 請輸入丟失的數據包2服務器2 請輸入所拍攝的數據包數目爲:對於3號服務器50 請輸入丟失數據包數量:3服務器3 對於服務器1的概率是:楠 對於服務器2概率:楠 對於服務器3概率爲:nan -------------------------------- 過程在14.06秒後退出,返回值爲0 新聞任何k繼續。 。 。 – namdik

回答

0

NaN幾乎總是除以0錯誤,它是在這種情況下。

  1. 首先,int/int的計算結果爲0,因爲1 < say中:

    P_S[i] = 1/say; 
    
  2. 接着,0 * x的計算結果爲0:

    A[d] = P_S[d] * P_B[d]; 
    
  3. 然後,0 + 0的計算結果爲0:

    sum = sum + A[f]; 
    
  4. 最後,x/0計算爲NaN在:

    final[a] = (float) A[a]/sum; 
    

這是一個常見的初學者的錯誤。簡單地做float/int在開始:

P_S[i] = 1.0/say; 
+0

所以我必須將P_S [i]更改爲int或什麼? – namdik

+0

OMG謝謝你。你很高尚。有效。我只是改變說漂浮。它的工作。你拯救了我的生命 – namdik

0

你的循環計算P_S是不正確的:

P_S[i] = 1/say; 

既然說是一個int,並在你的例子說的值是3,使用整數除法,1 /爲1/3,即0(餘數爲1)。因此,P_S []的所有值都是零,這意味着A []的所有值也將爲零,這又意味着總和將爲零。所以當你試圖計算final []時,你除以零,因此NaN。也許你想:

P_S[i] = 1.0/say; 

使用1.0,你強制將浮點運算,所以你的結果將是0.33333 ...... 有在你的代碼其他低效以及,BYT那就是你的錯誤的直接原因。

+0

另外,數組在C++中是零索引的,所以你的循環(全部)應該是這樣的形式:「for(int i = 1; k SGeorgiades

+0

另外,每個循環都不需要使用不同的循環變量:它們都可以是「我」。另外,不需要太多的循環;在一個循環中完成所有的計算。 – SGeorgiades

相關問題