Why is this?
You can use factorial on integers (that should be the input), the output could be a string or a double, anyway you will alwas have the factorial. The only restriction is in the input.
Yes, i mean this function works fine for values up to 170! or something like that:
Expand|Select|Wrap|Line Numbers
- Public Function Factorial(ByVal bNum As Integer) As Double
- Dim I As Double
- If bNum <= 0 Then Exit Function
- Factorial = 1
- For I = 1 To bNum
- Factorial = Factorial * I
- Next
- End Function
What is a Gamma?
A Gamma Function is the generalization of the Factorial Function (this means you can use any positive number in it). If you use a Gamma for an integer, it'll give you the Factorial of the previus integer. i.e.:
G(5) = 4 ! = 24
The advantage is that even if you cannot have 4.25 ! , you can always have
G(5.25) = 35.2088612458766
Cool!!!
To obtain it, you can use many numerical methods. Here I used an old friend by Euler-Mascheroni.
Expand|Select|Wrap|Line Numbers
- Public Function Gamma(ByVal Dou1 As Double) As Double
- Dim I As Integer
- Dim Dou2 As Double
- Dim Dou3 As Double
- If Fix(Dou1) = Dou1 Then
- If Dou1 = 0 Or Dou1 = 1 Then
- Gamma = 1
- Exit Function
- Else
- Dou2 = 1
- For I = 1 To Dou1 - 1
- Dou2 = Dou2 * I
- Next
- Gamma = Dou2
- Exit Function
- End If
- ElseIf Dou1 > 3 Then
- Dou2 = 1
- For I = 1 To (Fix(Dou1) - 1)
- Dou2 = Dou2 * (Dou1 - 1)
- Dou1 = Dou1 - 1
- Next
- Dou3 = Exp(-0.57721566 * Dou1) / Dou1
- For I = 1 To 9999
- Dou3 = Dou3 * ((1 + (Dou1 / I)) ^ (-1)) * Exp(Dou1 / I)
- Next
- Dou3 = Dou2 * Dou3
- Gamma = Dou3
- Else
- Dou3 = Exp(-0.577215664901533 * Dou1) / Dou1
- For I = 1 To 9999
- Dou3 = Dou3 * ((1 + (Dou1 / I)) ^ (-1)) * Exp(Dou1 / I)
- Next
- Gamma = Dou3
- End If
- End Function
Kad