As friend Bruno put it so eloquently…
…but every day is a good day to do some SQL. So here’s some SQL pi calculations I’ve tweeted out on this day over the years, that I thought I would capture here for posterity.
SQL rocks.
SQL> with t(n,p,s) as
2 ( select sqrt(2) n, sqrt(2)/2 p , 1 s from dual
3 union all
4 select sqrt(2+n), sqrt(2+n)*p/2 , s+1
5 from t, dual
6 where t.s <= 16 )
7 select 2/p pi from t where s = 16;
PI
----------
3.14159265
SQL> select sqrt(6*sum(1/power(level,2)))
2 from dual connect by level<1e5
3 /
SQRT(6*SUM(1/POWER(LEVEL,2)))
-----------------------------
3.1415831
SQL> select
2 sum((
3 4 / (8*(level-1)+1) -
4 2 / (8*(level-1)+4) -
5 1 / (8*(level-1)+5) -
6 1 / (8*(level-1)+6)
7 ) / power(16,level-1)) pi
8 from dual connect by level <= 10;
PI
----------
3.14159265
SQL> select sqrt(8*sum(1/power((level*2-1),2))) pi
2 from dual
3 connect by level <= 100000
4 order by 1 desc;
PI
----------
3.14158947
SQL> with t as
2 ( select
3 dbms_random.value(0,1) x,
4 dbms_random.value(0,1) y
5 from dual connect by level <= 1000000 )
6 select
7 count(case when sqrt(x*x+y*y) <= 1 then 1 end)/
8 count(*)*4 pi
9 from t;
PI
--------
3.142468
SQL> select 8*sum(1/((4*(level-1)+1)*(4*(level-1)+3))) pi
2 from dual
3 connect by level <= 100000;
PI
----------
3.14158765
with t(s,a,b,t,p) as
( select 1 s,1 a,1/sqrt(2) b,1/4 t,1 p from dual
union all
select s+1 s,(a+b)/2 a,sqrt(a*b) b,t-p*power((a - ((a+b)/2)),2) t,2*p p
from t
where s < 10
)
select (a+b)*(a+b)/(4*t) pi
from t
where s = 10;
PI
----------
3.14159265
SQL> select
2 4*sum(
3 power(-1,level-1)/(level*2-1)*
4 ( 12*power(1/18,level*2-1)+
5 8*power(1/57,level*2-1)-
6 5*power(1/239,level*2-1))) pi
7 from dual
8 connect by level <= 100;
PI
----------
3.14159265
SQL> select sqrt(8*sum(1/power((level*2-1),2))) pi
2 from dual
3 connect by level <= 100000
4 order by 1 desc;
PI
----------
3.14158947
SQL> select
2 4*sum(
3 power(-1,level-1)/(level*2-1)*
4 ( 12*power(1/18,level*2-1)+
5 8*power(1/57,level*2-1)-
6 5*power(1/239,level*2-1))) pi
7 from dual
8 connect by level <= 100;
PI
----------
3.14159265