2016-12-02 28 views
3

我有哪裏都是2個值1.18973e + 4932矢量的意思是,1.18973e + 4932C++算INF當我們試圖尋找差異和2個大型值1.18973e + 4932

vector<long double> v; 

在我的課程,我需要找到向量中所有值的的平均值方差

long double mean() const { 
    long double sum = 0; 

    for (unsigned int i = 0 ; i < len ; i ++) 
     sum += v[i]; 

    return sum/len; 
    } 

在這裏,我試圖尋找差異

long double variance() const { 
    long double m = mean(); 
    long double sum = 0; 

    for (unsigned int i = 0 ; i < len ; i ++) 
     sum += (v[i] - m) * (v[i] - m); 

    return sum/len; 
} 

但我正在逐漸INF與1.18973e + 4932值

+3

這取決於您的編譯環境中「long double」編譯的內容,但我確實知道'1.18973e + 4932'的waaaaay大於[64位浮點的最大範圍](http:// stackoverflow .com/questions/1848700 /最大整數,可以被存儲在一個雙),只​​有勉強小於80位浮點數的最大範圍。 – Xirema

回答

2

我回頭看這個答案假設,你正在使用long double,因爲你的編譯器正在將它編譯成80位浮點數。

你的第一個問題是你的mean()函數,其中1.18973e+4932 + 1.18973e+4932立即溢出到無窮大,因爲80位浮點數的最大值是〜1.2e + 4932。 inf/2仍然等於inf,所以您的mean()函數返回值爲inf

然後,在您的差異函數中,您正在計算(1.18973e+4932 - inf) * (1.18973e+4932 - inf),這將解析爲-inf * -inf,這將解析爲inf。然後,再次,inf/2等於inf

正如你在你自己的答案中提到的那樣,在你總結他們時將每個成員除以2,而不是求和然後除,避免溢出(儘管如果不是處理極大數目,處理非常小的數字!)

另一個解決辦法是借用多倍庫(如boost.multiprecision)和刪除你的價值觀與這些類型的計算處理時不會溢出quad或更大的浮點類型。

+0

它適用於我))但非常感謝你的答案 –

0

我很慚愧的結果。我無法前解決它......

,你可以加號

平均分前值答案:

long double mean() const { 
    long double sum = 0; 

    for (unsigned int i = 0 ; i < len ; i ++) 
     sum += v[i]/len; 

    return sum; 
    } 

方差:

它使用這意味着它將是0