31 lines
1.3 KiB
Plaintext
31 lines
1.3 KiB
Plaintext
create or replace function gamma_taylor(x) as (
|
|
select gamma
|
|
from ( select [
|
|
1.00000000000000000000, 0.57721566490153286061, -0.65587807152025388108, -0.04200263503409523553,
|
|
0.16653861138229148950, -0.04219773455554433675, -0.00962197152787697356, 0.00721894324666309954,
|
|
-0.00116516759185906511, -0.00021524167411495097, 0.00012805028238811619, -0.00002013485478078824,
|
|
-0.00000125049348214267, 0.00000113302723198170, -0.00000020563384169776, 0.00000000611609510448,
|
|
0.00000000500200764447, -0.00000000118127457049, 0.00000000010434267117, 0.00000000000778226344,
|
|
-0.00000000000369680562, 0.00000000000051003703, -0.00000000000002058326, -0.00000000000000534812,
|
|
0.00000000000000122678, -0.00000000000000011813, 0.00000000000000000119, 0.00000000000000000141,
|
|
-0.00000000000000000023, 0.00000000000000000002
|
|
] as a,
|
|
length(a) as n,
|
|
(with recursive cte as (
|
|
select 2 as an, a[n] as acc
|
|
union all
|
|
select an+1 as an,
|
|
(acc * (x-1)) + a[1 + n-an] as acc
|
|
from cte
|
|
where an <= n
|
|
)
|
|
select 1 / last(acc order by an) from cte) as gamma
|
|
)
|
|
limit 1
|
|
);
|
|
|
|
## Comparison
|
|
select x, gamma, taylor, 2 * @(gamma-taylor)/(gamma+taylor) as "%"
|
|
from (select x, gamma(x) as gamma, gamma_taylor(x) as taylor
|
|
from (select x/3 as x from range(1,11) t(x))) ;
|