나를 위해 pi를 인쇄 할 수있는 명령은 무엇입니까? 인쇄 할 자릿수를 지정하고 싶습니다. 온라인에서 아무것도 찾을 수 없습니다. 파이를 인쇄하고 싶습니다.
나를 위해 pi를 인쇄 할 수있는 명령은 무엇입니까? 인쇄 할 자릿수를 지정하고 싶습니다. 온라인에서 아무것도 찾을 수 없습니다. 파이를 인쇄하고 싶습니다.
답변:
이 명령을 사용할 수 있습니다 :
echo "scale=5; 4*a(1)" | bc -l
3.14159
여기서 scale은 소수점 뒤의 자릿수입니다.
참조 : 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
하면 어떤 원자 연산에도 5 자리 이상의 소수를 사용하지 않습니다.
π 값을 계산할 수있는 것을 원한다면 몇 가지 접근 방식이 있습니다. 아마도 가장 확실한 해결책은 pi
(데비안 패키지 링크) 와 같은 기성품 패키지를 사용하는 것입니다. 데비안의 패키지 설명을 신뢰할 수 있다면 메모리에 의해서만 제한되는 임의의 정밀도로 값을 계산할 수 있습니다.
pi
실제로는 CLN 라이브러리 (Class Library for Numbers)에 포함 된 예제입니다 . 여기에는 Pi, Fibonacci 등과 같은 임의의 길이의 숫자를 생성하는 도구를 제공하는 예제 응용 프로그램이 포함되어 있습니다. CLN 패키지는 데비안 / 우분투에서 사전 패키지로 제공됩니다 (위의 데비안 링크가 가리키는 것).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
참고 : 이 예제의 소스는 여기 CLN 코드베이스의 소스에 있습니다 .
Fedora에서 소스 타르볼을 다운로드하여 직접 빌드해야했지만 약간의 소름이 끼었습니다. 어떤 이유로 든 cln
Fedora 의 패키지 에는 라이브러리 만 포함되어 있지만 데비안 / 우분투 버전 (위)에서 사용 가능한 예제는 무시합니다.
아치에서 같은 프로그램 제공 패키지 (감사 Amphiteót을 ).cln
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
. 이것은 약 17 자리의 정밀도를 갖는 숫자에 대해 printf
C 언어 double
유형 표현을 사용 하는 명령의 제한이 없습니다 . 반올림 답변을printf
참조하십시오 .
scale=s-1
자를 자릿수를 설정합니다. pi/1
잘라내기를 적용하기 위해 결과를 1로 나눕니다. 단순 pi
은 숫자를 자르지 않습니다.
반올림을 반올림하면 첫 번째 숫자에 5를 더해야합니다 (5 x 10 -s ). 5보다 큰 숫자의 경우 남은 마지막 숫자가 증가합니다.
홉스 의 테스트 에서 반올림 / 잘라내는 3 개의 추가 숫자 ( 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
펄 한 줄 ( bignum 사용 ) :
perl -Mbignum=bpi -wle 'print bpi(NUM)'
예 :
perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159
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
합니다. 우분투 (& 풍미)에서는 표준 이 아닙니다 . JFYI.
내장 된 pi () 함수를 사용하여 PHP에서 매우 간단합니다 :
<?php
echo round(pi(), 2);
?>
이 질문을 어떻게 놓쳤습니까?
여기 에 몇 주 전에 Stack Overflow에 게시 한 파이썬 파이 프로그램이 있습니다. 특히 빠르지는 않지만 많은 숫자를 사용할 수 있습니다 . :) 그러나 그 스레드에서 언급했듯이 일반적으로 임의의 정밀 산술을 위해 Python의 mpmath 모듈을 사용하며 mpmath는 다소 빠른 pi 메이커를 가지고 있습니다.
예 :
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
IMHO는 단일 코어 2GHz 프로세서, 2 기가 RAM, 구형 IDE 드라이브에 쓰는 시스템에서 실행되는 것을 고려할 때 5 초 안에 500000 소수의 파이가 너무 초라하지는 않다.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
pip3를 설치 한 후 mpmath를 2 초 이내에 백만 자릿수로 시도하십시오 . 나쁘지 않아 !!!.
당신이 경우 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)
. 1-2 분 후에 원하는 값 주위에 매달려 있었고 멈추기 전에 3.1409에 훨씬 가깝습니다. 흥미롭고 재미있다! 고맙습니다!
pi에 대해 스피 곳 알고리즘을 사용할 수 있습니다. Dik Winter와 Achim Flammenkamp의 다음 C 프로그램은 한 번에 한 자리 씩 첫 15,000 자리의 pi를 생성합니다.
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();'
부동 소수점의 크기는 플랫폼에 따라 다르지만 대략 14 자리의 정밀도로 최대 ~ 1.8e308이 일반적인 값 (64 비트 IEEE 형식)입니다. [더 읽기]
보다 정확한 정밀도를 원한다면 Rosetta Code 또는 Code Golf SE 에서 일부 프로그래밍 솔루션을 확인하십시오.
관련 : SR.SE 에서 PI를 1000 자리 이상으로 계산할 수있는 소프트웨어
다음은 사용자가 지정한 자릿수 ( '.'포함)로 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
의 초기 값을 세는 9 자리를 인쇄합니다 3
. 또한 반올림 오류의 손가락을 가리키고 있지만 ./pi.sh 6
출력 3.1415
이 최적이 아닐 수 있습니다.
scale=X
옵션은 bc
숫자를 반올림하지 않지만 단순히 X 번째 십진수로 숫자를 자릅니다.
나는 Abey의 대답을 좋아하지만 bc가 마지막 자리를 어떻게 바꾸 었는지 좋아하지 않았습니다.
echo "scale=5; 4*a(1)" | bc -l
3.14156
그래서 자릿수를 설정하기 위해 scale used printf를 제거했습니다.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
에 비해 부동 소수점 숫자에 심각한 제한 이 있기 때문 bc
입니다. 그것들은 약 17 자리의 정밀도 로 C 언어 double
유형 으로 표현 되므로 약 17 번째 자리 이후의 0이 아닌 자리도 가짜입니다! ------에 의해 제한되지 않는 결과의 올바른 반올림으로 답변을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)
두 개의 세 자리 숫자를 기억하기가 훨씬 쉽다는 것을 알게되었다. 나는 355 대신에 335를 사용하거나 113 대신에 133을 쉽게 사용할 것이다.
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
( 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
은 매우 빠를 것으로 예상됩니다. and와 printf
같은 일반적인 쉘에 내장 된 쉘 이기 때문에 프로세스를 생성하지 않습니다.
또한 어떤 종류의 부동 소수점 관련 코드도 건드리지 않고 바이트 배열 만 조작합니다 (명시 적으로 멀티 바이트 문자는 아님). 일반적으로 부동 소수점을 사용하는 것보다 훨씬 빠릅니다.bash
zsh
종종, 대체 이유가 printf
에 의해 /usr/bin/printf
보장 일관성이나 호환성에가. 이 경우 내장 기능을 사용할 수 있다고 생각합니다.이 기능을 사용 /usr/bin/printf
하면 프로세스를 포크하여 "빠른"이점을 줄일 수 있습니다. 호환성
의 일반적인 문제 printf
는 로캘에 따라 숫자 출력 형식입니다. .
숫자 구분 은 ,
로케일 설정 에 따라 변경 될 수 있습니다 . 그러나 .
로케일에 영향을받지 않는 리터럴을 포함하는 문자열 상수 만 사용합니다 .
StéphaneChazelas는 printf %.5s
다른 방식으로 작동 한다고 지적했습니다 .zsh
평소와 같이 바이트가 아닌 문자를 계산하여. 운 좋게도 상수 UTF-8
는 고정 너비 인코딩이 아닌 유니 코드에 공통 인코딩을 사용하는 한 ASCII가 낮은 하위 범위의 문자 만 사용합니다.이 인코딩은 관련 인코딩에서 문자 당 1 바이트로 인코딩됩니다.
printf %.5s
zsh을 (현명하지만, POSIX에 대한)에 기반을 둔 문자 (안 바이트)입니다. ksh93
의 %.5Ls
그래프 기반입니다.