RosettaCodeData/Task/Cumulative-standard-deviation/Visual-Basic/cumulative-standard-deviati...

51 lines
1.2 KiB
VB.net

Function avg(what() As Variant) As Variant
'treats non-numeric strings as zero
Dim L0 As Variant, total As Variant
For L0 = LBound(what) To UBound(what)
If IsNumeric(what(L0)) Then total = total + what(L0)
Next
avg = total / (1 + UBound(what) - LBound(what))
End Function
Function standardDeviation(fp As Variant) As Variant
Static list() As Variant
Dim av As Variant, tmp As Variant, L0 As Variant
'add to sequence if numeric
If IsNumeric(fp) Then
On Error GoTo makeArr 'catch undimensioned list
ReDim Preserve list(UBound(list) + 1)
On Error GoTo 0
list(UBound(list)) = fp
End If
'get average
av = avg(list())
'the actual work
For L0 = 0 To UBound(list)
tmp = tmp + ((list(L0) - av) ^ 2)
Next
tmp = Sqr(tmp / (UBound(list) + 1))
standardDeviation = tmp
Exit Function
makeArr:
If 9 = Err.Number Then
ReDim list(0)
Else
'something's wrong
Err.Raise Err.Number
End If
Resume Next
End Function
Sub tester()
Dim x As Variant
x = Array(2, 4, 4, 4, 5, 5, 7, 9)
For L0 = 0 To UBound(x)
Debug.Print standardDeviation(x(L0))
Next
End Sub