파이 데이(Pi Day)입니다! SQL로 파이를 계산해 봅시다
파이 데이(Pi Day)를 축하합니다! ClickHouse에서 SQL 쿼리로 파이(π)를 계산해 보면 재미있겠다는 생각에 직접 시도해 보았습니다. 지금까지 도출한 결과를 소개합니다…
- 이 예제에서는 ClickHouse
numbers_mt테이블 함수를 사용해 10억 개의 행을 반환하며, 계산에는 40ms밖에 걸리지 않습니다:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)
┌- 다음 예시도 10억 개의 숫자를 처리하지만, 그렇게 빠르지는 않습니다:
SELECT 3 + (4 * sum(if((number % 2) = 0, if((number % 4) = 0, -1 / ((number * (number + 1)) * (number + 2)), 1 / ((number * (number + 1)) * (number + 2))), 0))) AS pi
FROM numbers_mt(2, 10000000000)
┌- 이 방법은 ClickHouse에서 당연히 저희가 가장 선호하는 방식이며(가장 정확하기도 합니다!):
SELECT pi()
┌- 이 문제를 만든 사람은 삼각법을 제대로 알고 있었네요:
SELECT 2 * asin(1) AS pi
┌- 원하는 자릿수를 지정할 수 있는 편리한 API는 다음과 같습니다:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')
┌- 이 방식은 기발합니다 - ClickHouse 거리 함수를 사용합니다:
WITH random_points AS
(
SELECT (rand64(1) / pow(2, 64), rand64(2) / pow(2, 64)) AS point
FROM numbers(1000000000)
)
SELECT (4 * countIf(L2Norm(point) < 1)) / count() AS pi
FROM random_points
┌- 물리학자라면 이 정도면 만족하실 것입니다:
SELECT 22 / 7
┌- 또 다른 간접적인 방법(Alexey Milovidov가 제안한 방법입니다)도 있는데, 소수점 이하 7자리까지 정확하고 빠릅니다:
WITH
10 AS length,
(number / 1000000000.) * length AS x
SELECT pow((2 * length) * avg(exp(-(x * x))), 2) AS pi
FROM numbers_mt(1000000000.)
┌