Какая команда может напечатать пи для меня? Я хочу указать, сколько цифр он печатает, я не смог ничего найти в Интернете. Я просто хочу иметь возможность печатать пи.
Какая команда может напечатать пи для меня? Я хочу указать, сколько цифр он печатает, я не смог ничего найти в Интернете. Я просто хочу иметь возможность печатать пи.
Ответы:
Вы можете использовать эту команду:
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, Fibonacci и т. Д. Пакеты 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
типа языка C для чисел, которые имеют точность около 17 значащих цифр. Смотрите ответ с printf
округлением .
scale=s-1
устанавливает количество цифр для усечения. pi/1
делит результат на 1, чтобы применить усечение. Простой pi
не усекает число.
Завершают половина вверх требует , чтобы добавить 5 к первой цифре , которая будет отрезана (5 × 10 -s ) , так что в случае цифр высших равного 5 последняя цифра , которая останется , будет увеличиваться.
Из тестов Хоббса кажется, что трех дополнительных цифр, которые будут округлены / обрезаны ( scale=s+2
) будет достаточно даже для очень длинных чисел.
Приведенные выше примеры использования здесь строки , которые поддерживаются, например , в bash
, ksh
и zsh
. Если ваша оболочка не поддерживает здесь, используйте string echo
и pipe:
$ 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)
всего пару секунд на миллион цифр. Совсем неплохо !!!.
В Баш:
$ 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-программа, которую я опубликовал пару недель назад на 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 десятичных чисел числа пи за менее чем 5 секунд не слишком плохие, ИМХО, учитывая, что он работает на машине с одноядерным процессором 2 ГГц, 2 гигабайтами оперативной памяти и записывает на устаревший диск IDE.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(после pip3 установить mpmath) под две секунды для миллиона цифр. Совсем неплохо !!!.
Если вы node.js
установили, это сделает все возможное, чтобы найти пи для вас, хотя лучше не очень хорошо:
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
и цифры после этого продолжали колебаться, никогда не сходясь. Вероятно, это потому, что через некоторое время PRNG начинает повторяться. Использование 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, прежде чем я остановился. Интересно и весело! Спасибо!
Вы можете использовать алгоритм spigot для пи. Следующая программа на Си от 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 или Code Golf SE для некоторых программных решений.
Связанный: Программное обеспечение, которое может вычислить ПИ как минимум до тысячи цифр в SR.SE
Вот скрипт, который печатает число с числом цифр, указанным пользователем (включая «.»).
pi.sh
#!/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
НЕ будет округлять число, а просто обрезает число с десятой десятой цифрой.
Мне нравится ответ Аби, но мне не понравилось, как БК менял последнюю цифру.
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
типом языка C с точностью около 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)
гораздо легче запомнить эти 2 трехзначных числа ... Я бы легко использовал 335 вместо 355 или 133 вместо 113.
Можно предположить, что OP заинтересован в короткой, легко запоминающейся команде оболочки для печати π - но вопрос на самом деле не говорит об этом. Этот ответ игнорирует это предположение и отвечает на вопрос строго в письменном виде;
Хотя уже есть 18 ответов, один подход все еще отсутствует - и с таким количеством ответов можно подумать, что он не единственный, которого не хватает:
тривиальный: как напечатать π? Просто напечатайте π!
Такой подход кажется слишком бесполезным, чтобы даже думать об этом, но я покажу, что у него есть свои достоинства:
Обычно мы рассчитываем значение π. Я не понимаю, что мешает нам оптимизировать решение путем предварительного вычисления значения - это константа, любой компилятор сделает это.
Нам нужно некоторое количество цифр π с максимальной точностью. Таким образом, мы можем просто взять префикс константы в виде текста:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Вариант с явным аргументом для точности, например. для точности 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
Максимальная точность может быть выбрана произвольно с помощью подходящей константы, рассчитанной с использованием одного из других ответов. Он ограничен только максимальной длиной командной строки.
Он имеет постоянную сложность времени для поиска значения.
Это делает все ограничения и ограничения очевидными, основываясь на низкой сложности реализации.
Он корректно обрабатывает точность, превышающую максимум, возвращая константу с полной доступной точностью (без трейлинга 0
).
Так что это решение, хотя и тривиальное, имеет свои преимущества. Это может быть полезно, например, когда оно используется в функции оболочки.
Функциональность вышеуказанного решения также может быть дополнена без создания процесса cut
(предположим, echo
что это встроенная оболочка). Он использует команду printf
(обычно встроенный) в несколько непонятным образом:
Константа полностью handeled как струна (используется формат %s
), нет с плавающей точкой arithmethic участвует, так что пределы float
или double
не применяются здесь.
Значение точности %s
escape ( 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
совместимости является формат вывода чисел в зависимости от локали. Разделение .
для чисел может быть изменено на ,
основе настроек локали; Но мы не используем числа, просто строковую константу, содержащую литерал .
- не зависит от локали.
Стефан Шазелас отметил, что printf %.5s
вzsh
, считая символы, а не байты, как обычно. К счастью, наши константы используют только символы в нижнем ASCII-диапазоне, который кодируется одним байтом на символ в любой соответствующей кодировке, при условии, что мы используем общую UTF-8
кодировку для Unicode, а не кодировку с фиксированной шириной.
printf %.5s
это символ (не байт), основанный на zsh (разумно, но против POSIX). ksh93
«s %.5Ls
является graphem основе.