Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

لنحسب π باستخدام SQL

إنه يوم باي! لنحسب قيمة باي باستخدام SQL

عيد Pi سعيد! راودتنا فكرة أن يكون من الممتع حساب pi باستخدام استعلامات SQL في ClickHouse. إليك ما توصّلنا إليه حتى الآن…

  1. يستخدم هذا المثال table function ‏numbers_mt في ClickHouse لإرجاع مليار صف، ولا يستغرق تنفيذ العملية الحسابية سوى 40 مللي ثانية:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)

  1. يعالج المثال التالي أيضًا 1B رقمًا، لكن بوتيرة أبطأ:
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. هذا بالطبع هو المفضل لدينا في ClickHouse (وهو الأدق أيضًا!):
SELECT pi()

  1. يبدو أن صاحب هذا كان يعرف حساب المثلثات جيدًا:
SELECT 2 * asin(1) AS pi

  1. إليك واجهة برمجة تطبيقات عملية تتيح لك تحديد عدد الخانات التي تريدها:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')

  1. هذه الطريقة ذكية - إذ تستخدم دوال المسافة في 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. إذا كنتَ فيزيائيًا، فستكتفي بهذا:
SELECT 22 / 7

  1. طريقة غير مباشرة أخرى (هذه من 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.)

Navigation