Яка команда могла надрукувати pi для мене? Я хочу вказати, скільки цифр він друкує, я нічого не міг знайти в Інтернеті. Я просто хочу мати можливість друкувати пі.
Яка команда могла надрукувати pi для мене? Я хочу вказати, скільки цифр він друкує, я нічого не міг знайти в Інтернеті. Я просто хочу мати можливість друкувати пі.
Відповіді:
Ви можете використовувати цю команду:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Де шкала - це кількість цифр після коми.
Довідка: http://www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bashі інші оболонки , що підтримують тут рядки: bc -l <<< "scale=5; 4*a(1)".
scale=1000дає 999 правильних цифр досить швидко (остання цифра вимикається на 1, розумно, оскільки ми обчислюємо pi / 4, а потім множимо на 4). scale=4000дає 4000 правильних цифр за кілька секунд. scale=10000займає більше часу, ніж я маю терпіння, але, ймовірно, дає 9999 або 10000 правильних цифр.
Якщо ви tex(1)встановили:
tex --version | head -1 | cut -f2 -d' '
cut. Більше цифр можна надрукувати, якщо довго чекати і знову запустити команду.
Для друку з довільною точністю можна використовувати bcі формулу pi = 4*atan(1):
# bc -l
scale=<your precision>
4*a(1)
scaleваріанті, pi = 3.141592..але з чим echo "scale=5; 4*a(1)" | bc -l => 3.14156я б тоді очікував побачити 3.14159?
scaleвизначає точність використання для обчислення, тому при scale=5жодній операції не буде використано більше п'яти дробових цифр для будь-якої атомної операції.
Якщо ви хочете щось, що може обчислити значення π, то існує кілька підходів. Мабуть, найбільш очевидним рішенням буде використання готового пакету типу pi(посилання пакета Debian) , який, якщо довіряти опису пакету Debian, може обчислити значення довільної точності, обмеженої лише пам'яттю.
piнасправді є прикладом, який входить до бібліотеки CLN (Бібліотека класів для чисел) . Він включає приклади програм, які надають інструменти для генерації довільних довжин чисел, таких як Pi, Fibach і т.д. Пакети CLN доступні заздалегідь упакованими в Debian / Ubuntu (саме на це вказує посилання Debian вище).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
ПРИМІТКА . Джерело цих прикладів знаходиться тут у джерелі для бази коду CLN .
На Fedora мені довелося завантажити вихідний тарбол і створити його самостійно, але він створюється з невеликою суєтою. З будь-якої причини пакет clnFedora включає лише бібліотеку, але нехтує прикладами, доступними у версії Debian / Ubuntu (вище).
Arch забезпечує ту ж програму в на clnупаковці (спасибі Amphiteót ).
piзвучить як саме те, що ви шукаєте. Можна, наприклад, pi 300надрукувати перші 300 цифр.
Для до мільйона цифр ви можете використовувати наступне (тут для 3000 цифр):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cutвиходить? Якщо це так, я згоден, це було б O (n).
Деякі з інших відповідей показують неправильні цифри в останніх місцях виводу. Нижче наведено варіант відповіді з використанням,bc але з правильно закругленим результатом. Змінна sмістить кількість значущих цифр (у тому числі 3перед десятковою комою).
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1)+5*10^(-s); scale=s-1; pi/1"
3.1416
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1"
3.1415
Округлення виконується безпосередньо в bc. Це не має обмеження команди, printfяка використовує представлення doubleтипу мови С для чисел, які мають точність приблизно 17 значущих цифр. Дивіться відповідь із printfзаокругленням .
scale=s-1встановлює кількість цифр, які слід усікати. pi/1ділить результат на 1, щоб застосувати усічення. Просте число piне обрізає.
Завершують половина вгору вимагає , щоб додати 5 до першої цифри , яка буде відрізана (5 × 10 -s ) , так що в разі цифр вищих рівного 5 остання цифра , яка залишиться , буде збільшуватися.
З тестів на хоббі видно, що трьох додаткових цифр, які будуть округлені / відрізані ( scale=s+2), вистачить навіть для дуже довгих цифр.
Наведені вище приклади використання тут рядки , які підтримуються, наприклад , в bash, kshі zsh. Якщо ваша оболонка не підтримує тут, використовуйте рядок echoі натомість виконайте такі дії:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
З python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)це працює в Python 2 і 3. Тільки, здається, має 12 цифр.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])". Збільшити точність для додаткових цифр ... наприкладpython -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)лише пару секунд на мільйон цифр. Зовсім непогано !!!.
В bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtoditпотрібно groffвстановити. Тут, на Ubuntu (& ароматизаторів), це не стандартно. JFYI.
Дуже просто в PHP за допомогою вбудованої функції pi ():
<?php
echo round(pi(), 2);
?>
Як я пропустив це питання ...
Ось моя маленька програма Python pi, яку я опублікував пару тижнів тому на Stack Overflow. Це не особливо швидко, але може робити багато цифр. :) Однак, як я вже згадував у цій темі, я зазвичай використовую модуль mpmath Python для довільної арифметики точності, а mpmath має досить швидкий виробник пі.
Наприклад,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
500000 децималів pi за 5 секунд не надто пошарпано, IMHO, враховуючи, що він працює на машині з одноядерним процесором 2 ГГц, 2 гігабайт оперативної пам’яті та записом на літній диск IDE.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)(після встановлення pip3 mpmath) протягом двох секунд на мільйон цифр. Зовсім непогано !!!.
Якщо ви node.jsвстановили, це зробить все можливе, щоб знайти pi для вас, хоча найкраще це не дуже добре:
node -e 'for(a=0,b=4E8,m=Math,r=m.random;b--;)a+=(1>m.sqrt((c=r())*c+(d=r())*d));console.log(a/1E8)'
Приклади виходів:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'трохи краще, ніж найкраще.
echo pie?
Метод Монте-Карло
Див., Наприклад, це для пояснення цього методу.
Коваджі
Переваги
Весело :-)
perl -Mbignum -E '
for(0 .. 1_000_000){
srand;
$x=rand; # Random x coordinate
$y=rand; # Random Y coordinate
$decision = $x**2 + $y**2 <=1 ? 1:0; # Is this point inside the unit circle?
$circle += $decision;
$not_circle += 1-$decision;
$pi = 4*($circle/($circle+$not_circle));
say $pi
}'
Примітка. Я спершу спробував це без, srandале він застряг, 3.14і цифри після цього продовжували коливатися, ніколи не збігаючись. Це, мабуть, тому, що через деякий час ПРНГ починає повторюватися. Застосування srandдозволить уникнути того, щоб принаймні продовжити період псевдовипадкової послідовності. Це все здогади, тому сміливо виправляйте мене, якщо я помиляюся.
bignumопераціями в Perl, боюся, і не знаю жодної конкретної частини вищевказаної програми, яка потребувала б новішої Perl. У будь-якому випадку, що цікаво в цьому, це сам алгоритм. Спробуйте впровадити його на вибраній мовою, якщо ця Perl не працює для вас.
($x,$y,$circle,$not_circle)=(0,0,0);перед циклом, щоб переконатися, що всі змінні визначені перед використанням.
(0,0,0,0).
($x,$y,$circle,$not_circle)=(0,0,0,0). Через хвилину-дві він звисав навколо потрібного значення, тоді він підходив набагато ближче до 3.1409, перш ніж я зупинився. Цікаво та весело! Дякую!
Для pi можна використовувати алгоритм спіготів. Наступна програма C Dik Winter та Achim Flammenkamp дасть перші 15 000 цифр пі, по одній цифрі за один раз.
a[52514],b,c=52514,d,e,f=1e4,g,h;main(){for(;b=c-=14;h=printf("%04d",e+d/f))for(e=d%=f;g=--b*2;d/=g)d=d*b+f*(h?a[b]:f/5),a[b]=d%--g;}
PHP
Кілька прикладів:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Якщо ви хочете змінити точність, спробуйте:
php -d precision=100 -r 'echo pi();'
Розмір поплавця залежить від платформи, хоча максимум ~ 1,8e308 з точністю приблизно 14 десяткових цифр є загальним значенням (64-бітний формат IEEE). [читати далі]
Якщо ви шукаєте ще більш точну точність, перевірте код Rosetta або Code Golf SE на деякі програмні рішення.
Пов'язане: Програмне забезпечення, яке може обчислити PI принаймні до тисячі цифр на SR.SE
Ось сценарій, який друкує pi із кількістю цифр, вказаних (включаючи '.') Користувачем.
пі.ш
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
вихід
$ ./pi.sh 10
3.14159265
і зі значенням за замовчуванням:
$ ./pi.sh
3.14159
Я бачив людей, які використовують scaleяк bcваріант, але в моєму випадку ( bc 1.06.95) це не виводить правильне значення:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Помітьте останню цифру.
./pi.sh 10відбитки дев'ять цифр, вважаючи первісний 3. Крім того, ви вказуєте пальцем на помилку округлення, але ./pi.sh 6результати 3.1415, які можуть бути не оптимальними.
scale=Xпараметр bcНЕ буде округляти число, а просто відрізати число на X-й десятковій цифрі.
Мені подобається відповідь Ебі, але мені не сподобалося, як bc змінює останню цифру.
echo "scale=5; 4*a(1)" | bc -l
3.14156
Тому я видалив масштаб, що використовувався printf, щоб встановити кількість цифр.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printfщо є суворі обмеження на числа з плаваючою комою порівняно з bc. Вони представлені doubleтипом мови С з точністю близько 17 цифр, тому навіть ненульові цифри після приблизно 17-ї є хибними! ------ Я додав відповідь з правильним округленням результату, не обмеженимprintf . ------ Для того, щоб ця команда працювала з різними LC_ALL=C printf
Що робити, якщо ви не можете все життя запам'ятати цю arctanріч? Або припустимо, що ви навіть не знаєте, що ця функція існує в bc, тоді спробуйте запам'ятати цей простий поділ:
echo "scale=6; 355 / 113" | bc
3.141592
Працюватиме лише для 6 цифр, але для ненаукових розрахунків це буде добре.
Якщо ви думаєте, що ви також не можете запам'ятати ці два числа, спочатку напишіть знаменник, а потім чисельник:
113 355
Або чому ні
11 33 55
"подвійний 1, подвійний 3, подвійний 5". Усі цифри непарні. Щоб обчислити, розділіть 6-значний номер навпіл і поміняйте знаменник та чисельник, перш ніж ділити їх. Ось про це.
4 * arctan(1)набагато легше запам’ятати, що два трицифрові числа ... Я легко використовую 335 замість 355, або 133 замість 113.
Можна припустити, що ОП цікавить коротка, проста запам'ятована команда оболонки для друку π - але питання насправді цього не говорить. Ця відповідь ігнорує це припущення і відповідає на запитання строго так, як написано;
Хоча вже є 18 відповідей, один підхід все ще відсутній - і так багато відповідей, можна було б подумати, що це не єдиний, якого не вистачає:
Тривіальний: Як надрукувати π? Просто надрукуйте π!
Такий підхід видається надто марним, щоб навіть про це думати, але я покажу, що у нього є його меритри:
Ми зазвичай обчислюємо значення π. Я не бачу, що заважає нам оптимізувати рішення шляхом попереднього розрахунку значення - це константа, будь-який компілятор зробив би це.
Ми хочемо деякої кількості цифр π, до максимальної точності. Тож ми можемо просто приймати префікс константи як текст:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Варіант з явним аргументом для точності, наприклад. для точності5 :
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
Максимальну точність можна вибрати як завгодно, використовуючи відповідну константу, обчислену за допомогою одного з інших відповідей. Вона обмежена лише максимальною довжиною командного рядка.
Він має постійну часову складність для пошуку значення.
Це робить усі межі та обмеження очевидними, ґрунтуючись на низькій складності впровадження.
Він обробляє точність, більшу від максимально витонченої, повертаючи константу в повній доступній точності (без відставання 0).
Тож це рішення, хоча і банальне, але має переваги. Це може бути корисно, наприклад, якщо він використовується у функції оболонки, наприклад.
Функціональність рішення, що знаходиться вище, також може бути доповнена, не створюючи процес для cut(припустимо echo, що це вбудована оболонка). Він використовує команду printf(як правило, вбудовану) дещо незрозуміло:
Константа повністю обробляється як рядок (формат використовує %s), арифметична плаваюча точка не задіяна, тому межі floatабо doubleне застосовуються тут.
Значення точності %sвідходу ( 5у прикладі нижче) визначає довжину рядкового префікса для друку - яка є точністю. Це 3.частина printfформату, щоб запобігти обчисленню точності.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Альтернатива з точністю як окремий аргумент:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
Або трохи читабельніше (Зверніть увагу на пробіл між 3.і 14159..., вони є окремими аргументами):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
Очікується, що варіант використання printfможе бути дуже швидким: Тому printfщо вбудована оболонка в загальні оболонки, як bashіzsh вона не створює ніяких процесів.
Крім того, він не торкається будь-якого коду, пов'язаного з плаваючою комою, а лише маніпулювання масивами байтів (явно не багатобайтові символи). Зазвичай це швидше, часто набагато швидше, ніж використання плаваючої точки.
Часто є підстави замінити printf, /usr/bin/printfщоб гарантувати послідовність або сумісність. У цьому випадку я думаю, що ми можемо використовувати вбудований - що важливо, оскільки використання /usr/bin/printfзменшує «швидку» перевагу за рахунок процесу.
Поширена проблема printfсумісності - це формат виводу номера залежно від локальної локації. Розділення .для чисел може бути змінено на ,основі налаштування місцевості; Але ми не використовуємо числа, а лише константа рядка, що містить літерал .- не впливає на локаль.
StéphaneChazelas зазначав, що в Росії printf %.5sпрацює інакшеzsh, підраховуючи символи, а не байти, як зазвичай. На щастя, наші константи використовують лише символи нижнього діапазону ASCII, який кодується одним байтом на символ у будь-якому відповідному кодуванні, якщо ми використовуємо загальне UTF-8кодування для Unicode, а не кодування фіксованої ширини.
printf %.5schar (не байт) базується на zsh (розумно, але проти POSIX). ksh93's %.5Lsна основі графем.