Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Vamos calcular pi com SQL

É o Dia do Pi! Vamos calcular pi com SQL

Feliz Dia do Pi! Achamos que seria divertido calcular pi usando consultas SQL no ClickHouse. Veja o que chegamos até agora…

  1. Este exemplo usa a table function numbers_mt do ClickHouse para retornar 1 bi de linhas e leva apenas 40 ms para fazer o cálculo:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)

  1. O exemplo a seguir também processa 1 bilhão de números, só que não tão rápido:
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)

  1. Este é, obviamente, o nosso favorito aqui no ClickHouse (e o mais preciso!):
SELECT pi()

  1. Alguém mandou bem na trigonometria nessa aqui:
SELECT 2 * asin(1) AS pi

  1. Aqui está uma API prática que permite especificar quantos dígitos você quer:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')

  1. Este aqui é inteligente - usa as funções de distância do 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

  1. Se você é físico, vai gostar desta:
SELECT 22 / 7

  1. Outro método indireto (proposto por Alexey Milovidov) que tem precisão de 7 casas decimais - e é rápido:
WITH
    10 AS length,
    (number / 1000000000.) * length AS x
SELECT pow((2 * length) * avg(exp(-(x * x))), 2) AS pi
FROM numbers_mt(1000000000.)

Navigation