Яка команда могла надрукувати 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 мені довелося завантажити вихідний тарбол і створити його самостійно, але він створюється з невеликою суєтою. З будь-якої причини пакет cln
Fedora включає лише бібліотеку, але нехтує прикладами, доступними у версії 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 %.5s
char (не байт) базується на zsh (розумно, але проти POSIX). ksh93
's %.5Ls
на основі графем.