Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Calculemos pi con SQL

¡Es el Día de Pi! Calculemos pi con SQL

¡Feliz Día de Pi! Se nos ocurrió que sería divertido calcular pi con consultas SQL en ClickHouse. Esto es lo que hemos logrado hasta ahora…

  1. Este ejemplo usa la table function numbers_mt de ClickHouse para devolver 1B filas y solo tarda 40 ms en calcularlo:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)

  1. El siguiente ejemplo también procesa 1000 millones de números, aunque no tan 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 es, sin duda, nuestro favorito en ClickHouse (¡y el más preciso!):
SELECT pi()

  1. Quien hizo esto sabía de trigonometría:
SELECT 2 * asin(1) AS pi

  1. Aquí tienes una API útil que te permite especificar el número de dígitos que quieres:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')

  1. Este es ingenioso - usa las funciones de distancia de 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. Si eres físico, quedarás satisfecho con este:
SELECT 22 / 7

  1. Otro método indirecto (este se lo debemos a Alexey Milovidov), preciso hasta 7 decimales y además 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