2013-01-13 51 views
0

我有一個代碼來計算標準差:VB6:標準差失敗

Public Function StandardDeviation(ByRef arr() As Double) As Double 

'standard deviation 
Dim sum As Double 
Dim sumSquare As Double 
Dim value As Double 
Dim count As Long 
Dim index As Long 
sum = 0 
sumSquare = 0 
value = 0 
count = 0 
index = 0 

' evaluate sum of values 
For index = LBound(arr) To UBound(arr) 
    value = arr(index) 
    count = count + 1 
    sum = sum + value 
    sumSquare = sumSquare + value * value 
Next 

StandardDeviation = Sqr((sumSquare - (sum * sum/count))/count) 

End Function 

這似乎很好地工作。

碰巧,該值有時都是一樣的,例如:

0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 
    0.419208025523645 

在這種情況下,我得到錯誤「無效參數」在這一行:

StandardDeviation = Sqr((sumSquare - (sum * sum/count))/count) 

有人看到我的錯誤嗎?

+0

外面取出櫃檯加速計算沒有真正的錯誤,除非你正在運行到某些圓整的問題... sumsquare更經常捨去而不是和數的平方,所以你會得到一個稍微負面的結果sumsquare-(sum * sum/count) – Hrqls

回答

3

我的猜測是,你遇到了一個問題,你在「試圖」取一個負值的平方根。當數字都相同時,sumSquare應該與(sum * sum/count)相同。

我會建議下面的代碼。

If ((sum * sum/count)) > sumSquare Then 
    StandardDeviation = 0 
Else 
    StandardDeviation = Sqr((sumSquare - (sum * sum/count))/count) 
End If 
0

您可以通過循環

For index = LBound(arr) To UBound(arr) 
    value = arr(index) 
    sum = sum + value 
    sumSquare = sumSquare + value * value 
Next 

count = UBound(arr) - LBound(arr) + 1