Как я могу вычислить пи с помощью команды Bash

Я изучаю сценарии на bash. Изучая математические функции, я наткнулся на команду, которая вычисляла значение числа пи.

seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l

Хотя я понимаю, как работает основная команда seq, я не могу понять, как работает вышеуказанная команда. Кто-нибудь может прояснить, как это работает?


person poorvank    schedule 07.05.2014    source источник
comment
Почему это не может быть так просто: bc -l <<< 'scale=5; 22/7'   -  person anubhava    schedule 07.05.2014
comment
Посетите раздел вики с названием Непрерывные дроби.   -  person pawel7318    schedule 07.05.2014
comment
@anubhava Извините, но π не 22/7.   -  person devnull    schedule 07.05.2014
comment
Конечно, я знаю это, но даже это seq тоже приближение, хотя, без сомнения, лучшее.   -  person anubhava    schedule 07.05.2014
comment
Связанный: заголовок superuser.com/questions/275516/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 25.02.2021


Ответы (3)


Это вычисляет значение π с использованием ряда Грегори – Лейбница:

введите описание изображения здесь

seq -f '4/%g' 1 2 99999 генерирует дроби:

4/1
4/3
4/5
4/7
4/9
4/11
4/13
4/15
4/17
4/19

Конвейер вставки paste -sd-+ объединяет их с альтернативными разделителями - и +.

Наконец, bc -l выполняет арифметические действия, чтобы вывести результат.


РЕДАКТИРОВАТЬ: как указано в комментарии, эта последовательность сходится очень медленно. Формула Мачина имеет значительно более высокую скорость сходимости:

введите описание изображения здесь

Используя то же расширение для tan -1 (x):

введите описание изображения здесь

чтобы вычислить π, мы видим, что он дает правильное значение до 50 цифр 1, используя только первые 50 членов ряда:

$ { echo -n "scale=50;"; seq 1 2 100 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
3.14159265358979323846264338327950288419716939937510

Всего с помощью 100 членов значение π вычисляется с точностью до более чем 100 цифр:

$ { echo -n "scale=100;"; seq 1 2 200 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

1 Пи

person devnull    schedule 07.05.2014
comment
И эта последовательность сходится очень медленно. Вам нужно более 1500 итераций, чтобы получить приближение лучше, чем 22/7. - person Keith Thompson; 07.05.2014
comment
@KeithThompson Вы правы. Редактор вычисляет π по формуле Мачина, которая сходится намного быстрее. - person devnull; 09.05.2014

Это не прямой ответ на ваш вопрос об использовании seq, но число пи можно легко вычислить с помощью bc:

 echo "scale=1000; 4*a(1)" | bc -l

a - арктангенс, и это дает число пи до 1000 цифр.

person James Scriven    schedule 01.05.2015
comment
Вы можете передать sed 's/.$//' в конце и изменить его на scale=1001, потому что последняя цифра искажается, но мне все еще нравится этот ответ. - person mchid; 29.09.2019
comment
@mchid или также вы можете передать xargs по той же причине, чтобы избавиться от `` '' в EOL - person Vadim A. Misbakh-Soloviov; 02.08.2020
comment
Я бы также добавил BC_LINE_LENGTH=0 bc -l, чтобы избежать безумия с разрывом строки: unix.stackexchange.com/questions/365510/ - person Ciro Santilli 新疆再教育营六四事件ۍ 25.02.2021

seq -f 4 %g 1 2 99999 

Приводит данные:

4/1
4/3 
4/5 
...
4/9999

Команда paste берет этот список и вставляет - между первыми двумя, + между вторыми двумя и т. Д. (И помещает его в одну строку, поэтому):

4/1-4/3+4/5-4/7......4/9999

Это приближение к пи. Программа 'bc' вычисляет это и распечатывает значение.

person Nathaniel Flath    schedule 07.05.2014