2012-11-13 88 views
0

我想我可以通過製作一個返回平均值採樣分佈結果(帶有標準誤差)的小程序,使數據統計的生活變得更容易一些。它成功完成了這部分工作,但爲了通過使用公式發現​​來返回z分數,它返回-1#IND。我的這個公式的解釋是:C++數學評估不正確

((1/(sqrt(2 * pi) * stdev)) * pow(e, (normalpow)) 

其中

double normalpow = -0.5 * ((mean - popmean) * (mean-popmean)/stdev) 

我做多一點調查,發現(mean - popmean) * (mean - popmean)正在評估對0不管。我怎樣才能解決normalpow評估0這個問題。

#include <iostream> 
#include <string> 
#include <sstream> 
#include <math.h> 


using namespace std; 

double number ; 
double mean ; 
double popmean ; 
double stdev ; 
double square = 2; 
double e = 2.71828182845904523536; 
double pi = 3.14159265358979323846; 
double normalpow = -0.5*((mean-popmean)*(mean-popmean)/stdev); 
int main() 
{ 
    string continuer ; 
    do 
    { 
     cout << "Enter Sample Mean: " << endl; 
     cin >> mean; 
     cout << "Enter Population Mean: " << endl; 
     cin >> popmean; 
     cout << "Enter Standard Deviation: " << endl; 
     cin >> stdev; 
     cout << "Enter Sample Size: " << endl; 
     cin >> number; 
     if (stdev == 0) 
      cout << ((mean-popmean)/(number))<< endl; 
     else 
     { 
      cout << ((mean-popmean)/((stdev)/(sqrt(number))))<< endl; 
      cout << ((1/(sqrt(2*pi)*stdev))*pow(e, (normalpow)))<< endl; 
     } 
     cout << "If you want to continue, Press Y" << endl ; 
     cin >> continuer; 
    } while (continuer == "Y" || continuer == "y") ; 
    return 0; 
} 
+0

那麼'mean'和'popmean'是什麼意思? – Useless

+1

什麼變量類型是mean和popmean?可能需要將它們轉換爲浮點數或雙精度來避免整數截斷。 – madeFromCode

+0

我設置平均值和popmean作爲現在的雙倍。我的測試主題是9意味着和popmean 10。 – Hayden

回答

1
using namespace std; 

double number ; 
double mean ; 
double popmean ; 
double stdev ; 
double square = 2; 
double e = 2.71828182845904523536; 
double pi = 3.14159265358979323846; 
double normalpow = -0.5*((mean-popmean)*(mean-popmean)/stdev); 

這些是具有靜態存儲持續時間的所有變量,所以那些沒有明確initialisers被初始化爲0。

mean因此,popmeanstdev都是0時normalpow被初始化,而初始化導致

double normalpow = -0.5*(0.0*0.0/0.0); 

它給出了NaN。

之後你再也不會更改normalpow,所以涉及它的任何計算都會導致NaN。

+0

夠公平的。我是否應該稍後在代碼體中聲明函數,因爲所有的值都是在那裏定義的? – Hayden

+0

是的,或者你應該採取juanchopanza的建議,並定義一個真正的函數來獲得'normalpow'。 –

+0

這實際上有效。我是一個白癡,不知道這一點。謝謝。 – Hayden

0

這取決於如何計算meanpopmeanmean - popmean評估爲零,如果它們相同:mean == popmean

+0

事情是我交換他們,所以它是(popmean-mean)*(popmean-mean),它有相同的結果。 – Hayden

+0

當然,如果意思是== popmean,那麼意思是 - popmean == popmean - 的意思。這並不奇怪。你如何以及在哪裏計算兩個數字? –

0

而你正在使用的公式不正確,因爲你沒有計算標準偏差的平方。

+0

我以爲這兩個(mean-popmean)*(意思是popmean)是平方的。 – Hayden

+0

是的,但你也應該做「pow(stdv,2)」。 – hekri

+0

哦,是的,我明白了。 – Hayden

2

你的問題是在這裏:

double normalpow = -0.5*((mean-popmean)*(mean-popmean)/stdev); 

在這一點上,meanpopmeanstdev有垃圾值,因爲他們沒有被初始化。這聽起來像你想要的是一個功能。

double normalPow(double mean, double popmean, double stddev) 
{ 
    return -0.5*((mean-popmean)*(mean-popmean)/stdev); 
} 

然後調用它在你的主:

double normalpow = normalPow(mean, popmean, stdev); 

當然,你應該檢查stdev等於或接近0.的功能。

+0

Ooo好的建議在那裏。 – Hayden