Task

Implement one algorithm (or more) to compute the Gamma (



Γ


{\displaystyle \Gamma }

) function (in the real field only).

If your language has the function as built-in or you know a library which has it, compare your implementation's results with the results of the built-in/library function.

The Gamma function can be defined as:

  



Γ
(
x
)
=


∫

0


∞



t

x
−
1



e

−
t


d
t



{\displaystyle \Gamma (x)=\displaystyle \int _{0}^{\infty }t^{x-1}e^{-t}dt}


This suggests a straightforward (but inefficient) way of computing the 



Γ


{\displaystyle \Gamma }

 through numerical integration.



Better suggested methods:

 Lanczos approximation
 Stirling's approximation


A: @[
    1.00000000000000000000     0.57721566490153286061 neg 0.65587807152025388108
neg 0.04200263503409523553     0.16653861138229148950 neg 0.04219773455554433675
neg 0.00962197152787697356     0.00721894324666309954 neg 0.00116516759185906511
neg 0.00021524167411495097     0.00012805028238811619 neg 0.00002013485478078824
neg 0.00000125049348214267     0.00000113302723198170 neg 0.00000020563384169776
    0.00000000611609510448     0.00000000500200764447 neg 0.00000000118127457049
    0.00000000010434267117     0.00000000000778226344 neg 0.00000000000369680562
    0.00000000000051003703 neg 0.00000000000002058326 neg 0.00000000000000534812
    0.00000000000000122678 neg 0.00000000000000011813     0.00000000000000000119
    0.00000000000000000141 neg 0.00000000000000000023     0.00000000000000000002 
]
 
ourGamma: function [x][
    y: x - 1
    result: last A 
    loop ((size A)-1)..0 'n ->
        result: (result*y) + get A n
    result: 1 // result
    return result
]
 
loop 1..10 'z [
    v1: ourGamma z // 3
    v2: gamma z // 3
    print [
        pad (to :string z)++" =>" 10
        pad (to :string v1)++" ~" 30 
        pad (to :string v2)++" :" 30
        pad (to :string v1-v2) 30
    ]
]