pi (3.14159)를 어떻게 인쇄합니까? [닫은]


35

나를 위해 pi를 인쇄 할 수있는 명령은 무엇입니까? 인쇄 할 자릿수를 지정하고 싶습니다. 온라인에서 아무것도 찾을 수 없습니다. 파이를 인쇄하고 싶습니다.


28
언어를 선택하십시오 : rosettacode.org/wiki/Pi
Mark Plotnick

4
당신이 15 주변보다 더 많은 숫자하려는 경우가 더 많은 재미를 얻을 수 있습니다
Thorbjørn Ravn 안데르센

2
@DisplayName : 이는 배정 밀도 부동 소수점 값 (대부분의 언어에서 사용 가능한 최고 정밀도 "내장"FP 데이터 유형)을 사용하여 PI를 내부적으로 저장 / 계산하는 프로그램을 더 이상 사용할 수 없음을 의미합니다.
Matteo Italia

5
수십 년 전에 언어 라이브러리가 일반적으로 제공하기 전에 내 솔루션은 내가 사용했던 부동 소수점보다 더 많은 장소에 암기하는 것이 었습니다. -world는 다른 숫자보다 오류가 많으며 이론적으로는 숫자 값이 아닌 기호를 사용합니다.
keshlam

3
@syntaxerror 관심은 관련이 없습니다. 유명인의 알몸 사진을 요구하는 질문을 게시하는 경우 수천 번의 조회수를 얻을 수 있으며 공언 가능성이 높습니다. 그것은 주제에 관한 것이 아닙니다. 이 질문은 너무 광범위한 전형적인 예입니다. 답의 수를보십시오. 또한 영업 이익은 지정하지 않은 점에 유의 모든 가능한 답변은 본질적으로 무한하게 제한합니다. 어쨌든 닫기는 삭제되지 않습니다. 이 질문과 23 개의 답변은 모두 여기에 있습니다. 닫는 것은 더 이상 응답이 허용되지 않음을 의미합니다. π를 인쇄하는 방법이 더 필요합니까?
terdon

답변:


52

이 명령을 사용할 수 있습니다 :

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/


12
bash여기에서 문자열을 지원하는 짧은 버전 및 기타 쉘 : bc -l <<< "scale=5; 4*a(1)".
pabouk

2
얼마나 많은 자릿수가 나올지 궁금합니다.
DisplayName

4
@DisplayName은 꽤 많습니다. scale=1000999 개의 정확한 자릿수를 신속하게 제공합니다 (마지막 숫자는 1 씩, pi / 4를 계산 한 다음 4를 곱하기 때문에 합리적입니다). scale=4000몇 초 안에 4000 개의 정확한 숫자를 제공합니다. scale=10000인내심이있는 것보다 오래 걸리지 만 9999 또는 10000 개의 정확한 숫자를 제공 할 수 있습니다.
hobbs

4
'echo "scale = 5; 4 * a (1)"을 입력하면 내 컴퓨터에 잘못된 결과가 나타납니다. '-l은 3.14156을 반환 기원전 할 때 (9)에 의해 마지막 숫자해야
요르단 벤틀리

1
@JordanBentley, 결과의 올바른 반올림에 대한 답변을 추가했습니다 .
pabouk

61

당신이 만약 tex(1)설치 :

tex --version | head -1 | cut -f2 -d' '

13
이것은 영리하기 만하면 공감할만한 가치가 있습니다. 패키지를 업그레이드하면이 결과가 변경됩니다. 우리는 이것이 기능이나 버그라고 생각합니까?
CVn

8
@ MichaelKjörling 사실, 그것은 pi의 더 정확한 근사치로 바뀝니다.
Abrixas2

@ Abrixas2 예, 알고 있습니다. TeX의 마지막 버전은 버전 π입니다.
CVn

30
@DavidRicherby 소수를 추가 호출을 통해 인쇄 할 수 있습니다 cut. 오래 기다렸다가 명령을 다시 실행하면 더 많은 숫자를 인쇄 할 수 있습니다.
Steven D

1
@Ruslan은 구현에 따라 다릅니다. 나는이 특정한 경우에 그것이 "올바른"것이 될 것이라고 기대할 것이다.
Thorbjørn Ravn Andersen

23

임의의 정밀도로 인쇄하는 경우 bc다음 공식을 사용할 수 있습니다 pi = 4*atan(1).

# bc -l
scale=<your precision>
4*a(1)

2
옵션 에 대해 재미있는 것이 있지만 다음으로 볼 수 있습니까? scalepi = 3.141592..echo "scale=5; 4*a(1)" | bc -l => 3.141563.14159
fduff

7
scale계산에 사용할 정밀도를 지정하므로을 사용 scale=5하면 어떤 원자 연산에도 5 자리 이상의 소수를 사용하지 않습니다.
Abrixas2 2

@ fduff, 결과의 올바른 반올림에 대한 답변을 추가했습니다 .
pabouk

20

π 값을 계산할 수있는 것을 원한다면 몇 가지 접근 방식이 있습니다. 아마도 가장 확실한 해결책은 pi(데비안 패키지 링크) 와 같은 기성품 패키지를 사용하는 것입니다. 데비안의 패키지 설명을 신뢰할 수 있다면 메모리에 의해서만 제한되는 임의의 정밀도로 값을 계산할 수 있습니다.

pi실제로는 CLN 라이브러리 (Class Library for Numbers)에 포함 된 예제입니다 . 여기에는 Pi, Fibonacci 등과 같은 임의의 길이의 숫자를 생성하는 도구를 제공하는 예제 응용 프로그램이 포함되어 있습니다. CLN 패키지는 데비안 / 우분투에서 사전 패키지로 제공됩니다 (위의 데비안 링크가 가리키는 것).

$ ./pi 10
3.141592653

$ ./pi 20
3.1415926535897932384

참고 : 이 예제의 소스는 여기 CLN 코드베이스의 소스에 있습니다 .

다른 배포판

페도라

Fedora에서 소스 타르볼을 다운로드하여 직접 빌드해야했지만 약간의 소름이 끼었습니다. 어떤 이유로 든 clnFedora 의 패키지 에는 라이브러리 만 포함되어 있지만 데비안 / 우분투 버전 (위)에서 사용 가능한 예제는 무시합니다.

아치

아치에서 같은 프로그램 제공 패키지 (감사 Amphiteót을 ).cln


네, 제가 머리 속에 가지고있는 것을 입력 한 총 가치를 의미했습니다.
DisplayName

2
"총 가치"?? 무슨 뜻...?
Kyle Strand

2
@DisplayName은 나머지 답변을 읽습니다. 원하는 프로그램과 같은 전용 프로그램 pi이 있습니다. pi 300예를 들어 처음 300 자리를 인쇄하는 것과 같은 작업을 수행 할 수 있습니다 .
terdon

3
@KyleStrand 나는이 의견이 너무 좁아서 참으로 놀라운 답변을 발견했습니다. 안녕하세요, Fermat에서 일했습니다 !
terdon

나는 이것이 왜 두 개의 다운 보트를 받았는지 알고 싶습니다. 다운 보트 한 사람들은 답이 유용하지 않다고 결정하기 전에 답을 읽지 않았습니까?
CVn

17

백만 자리까지 다음을 사용할 수 있습니다 (여기서는 3000 자리).

curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000

2
이것은 합리적으로 O (1) 복잡성에 가까워 져야한다는 추가적인 이점이 있습니다. 아니면 그 모든 후 이익 아니지만 ...
CVN

7
또한 실제 네트워크에서 네트워크 상호 작용이 O (1) 시간 복잡성이라고 말하기는 어렵습니다. : P
HalosGhost

2
@HalosGhost 우리의 목적을 위해 ( 매번 n 자리 숫자 를 계산하는 것과 비교하여 ), 네트워크를 통해 특정 서버에서 고정 된 양의 데이터를 다운로드하는 것은 사실상 O (1) 일 가능성이있는 반면, n 자리 pi를 계산 하는 것은 적어도 O (log n)와 같고 아마도 더 높을 것입니다 (나는 그 알고리즘에 익숙하지 않습니다). 데이터의 실제 다운로드는 다운로드를 시작하는 데 오버 헤드보다 훨씬 더 많은 시간이 걸리기 때문에 다운로드 시간이 지배적이며 데이터 전송 속도가 합리적으로 고정되어 있으면 O (1) 근처에있을 수 있습니다. 따라서 O (1).
CVn

4
@ MichaelKjörling 당신이 O (1)을 말할 때 실제로 O (n)을 의미하지 않습니까? 다운로드 시간은 필요한 자릿수로 선형으로 표시되므로 O (n)입니다.
코드 InChaos

1
@CodesInChaos 아니요, 일정한 수의 자릿수 (1 백만, 여기)를 다운로드하기 때문에 다운로드 시간이 일정합니다 (지속적인 전송 속도가 제공됨). (이 특별한 경우) 컬이 다운로드 중에 인쇄하고 파이프가 cut종료 되어 파이프가 끊어지면 다운로드를 중지 할만 큼 똑똑하지 않은 한 ? 이 경우 O (n) 일 것입니다.
CVn

15

다른 답변 중 일부는 출력의 마지막 위치에 잘못된 숫자를 표시합니다. 다음은 올바르게 반올림 된 결과를 사용하여 답변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 자리의 정밀도를 갖는 숫자에 대해 printfC 언어 double유형 표현을 사용 하는 명령의 제한이 없습니다 . 반올림 답변을printf 참조하십시오 .

scale=s-1자를 자릿수를 설정합니다. pi/1잘라내기를 적용하기 위해 결과를 1로 나눕니다. 단순 pi은 숫자를 자르지 않습니다.

반올림을 반올림하면 첫 번째 숫자에 5를 더해야합니다 (5 x 10 -s ). 5보다 큰 숫자의 경우 남은 마지막 숫자가 증가합니다.

홉스테스트 에서 반올림 / 잘라내는 3 개의 추가 숫자 ( scale=s+2)가 매우 긴 숫자에도 충분할 것으로 보입니다 .

여기에 문자열

위의 예를 사용 여기 문자열 , 예를 들어 지원 bash, kshzsh. 쉘이 여기 문자열을 지원하지 않으면 echo대신 파이프를 사용하십시오 :

$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" |  bc -l
3.1415

2
반올림을 목적으로 세 자리를 추가로 계산하는 것은 주석에서 주장하는“올바른 반올림”이 아닙니다. 첫째, 계산 오류에 얽매이지 않습니다. fduff가 주장한 것처럼 마지막 장소에서 3 단위가 잘못 될 수 있다면 왜 마지막 장소에서 1000 단위로 잘못되지 않습니까? 둘째,“테이블 메이커의 딜레마”를 참조하십시오.
bio

12

펄 한 줄 ( bignum 사용 ) :

perl -Mbignum=bpi -wle 'print bpi(NUM)'

예 :

perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159

10.000 자리 : 펄에서 8 분에 가까워지고 BC에서 4보다 작습니다. 가장 빠르지는 않습니다.
Isaac Isaac

9

python2로 :

$ python -c "import math; print(str(math.pi)[:7])"
3.14159

4
완벽을 기하기 위해이 솔루션은 python2 전용입니다.
HalosGhost

편집 후 (..)이것은 Python 2 및 3에서 작동합니다. 12 자리 만있는 것 같습니다.
Anthon

-c $ 파이썬 "수입 수학, 인쇄 (형식 (Math.PI로, '.400f'))"3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
아르 템 Shitov

1
@ArtemShitov-내 나쁜, gmpy2 가져 오기를 시도 하십시오 (설치되어있는 경우) python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])". 더 많은 자릿수에 대한 정밀도 증가 ... 예 :python -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
don_crissti 1

1
내가 찾을 수있는 가장 빠른 from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)숫자는 백만 자리 에 불과 몇 초였습니다. 나쁘지 않아 !!!.
Isaac

7

루비 사용하기 :

require "bigdecimal"
require "bigdecimal/math"
include BigMath

BigDecimal(PI(100)).round(9).to_s("F")

3.141592654

1
하나 라이너 :ruby -e 'require "bigdecimal"; require "bigdecimal/math"; include BigMath; puts BigDecimal(PI(100)).round(9).to_s("F")'

4

bash에서 :

$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884

@ Amphiteóth 를 설치 afmtodit해야 groff합니다. 우분투 (& 풍미)에서는 표준 이 아닙니다 . JFYI.
syntaxerror

@syntaxerror 감사합니다, 좋은 지적입니다! 내 예를 제거했습니다. 내 요점은이 AI를 읽었을 때 grep상수를 검색하는 시스템에서 실행 되어 두 곳 이상에서 발견되었습니다. 이것이 나를 위해 +1 한 이유입니다!

3

내장 된 pi () 함수를 사용하여 PHP에서 매우 간단합니다 :

<?php 
echo round(pi(), 2);
?>

1
명령 행 버전을 제공하기 위해 이것을 편집 할 수 있습니까 ?
curiousdannii

3

이 질문을 어떻게 놓쳤습니까?

여기 에 몇 주 전에 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 초 이내에 백만 자릿수로 시도하십시오 . 나쁘지 않아 !!!.
Isaac

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

4
짧을수록 node -e 'console.log(Math.PI)'가장 좋습니다.
chbrown

1
@chbrown 운영 체제의 "심각하지 않은"요구 사항을 충족하지 않습니다.
Paul

1
"심각하지 않은"요건은 무엇입니까? OP는 방금 "심각하지 않은"답변을 원치 않는 재미를 요구한다고 말했다. 어쨌든 그것은 무엇을 의미합니까? 같은 것 echo pie?
terdon

나는 당신이 질문을 할 때 때때로 사람들이 "이것은 스크립트 작성 팩토리가 아니다"라고 말했기 때문에, 나는 그것에 대한 실제 이유가 없기 때문에, 나는 단지 pi를 인쇄하는 방법을 알고 싶다고 말했다.
DisplayName

@ Amphiteóth 컴퓨터에서 실행되는 데 약 20 초가 걸립니다. 시간을 좀 주어야 할 수도 있습니다.
Paul

2

몬테 카를로 방법

이 방법에 대한 설명은 예를 들어 이것을 참조하십시오 .

경고

  • 임의로 정확하지 않음
  • 유용한 것으로 수렴하는 데 시간이 오래 걸림

장점

재미 :-)

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의사-랜덤 시퀀스의 기간을 피하거나 적어도 길게 할 것이다. 이 모든 추측입니다, 내가 틀렸다면 나를 바로 수정하십시오.


@ Amphiteót 무슨 일이 일어나고 있는지 잘 모르겠습니다. 도움이된다면 Perl v5.14.2입니다. 나는 bignumPerl의 운영에 정통 하지 않고 두려워서 새로운 Perl을 필요로하는 위 프로그램의 특정 부분을 모른다. 어쨌든 흥미로운 것은 알고리즘 자체입니다. 이 Perl이 효과가 없다면 선택한 언어로 구현해보십시오.
Joseph R.

1
@ Amphiteót 알겠습니다. 편집으로 문제가 해결됩니까?
Joseph R.

@ Amphiteót ($x,$y,$circle,$not_circle)=(0,0,0);루프 앞에 추가하여 모든 변수를 사용하기 전에 정의 할 수 있습니다 .
Joseph R.

@ Amphiteót 내 실수. 위의 괄호는 (0,0,0,0)이었다.
Joseph R.

다시 /5.20.1 : 감각을 만들지 만 그것을 보지 않았다! 실제로 ($x,$y,$circle,$not_circle)=(0,0,0,0). 1-2 분 후에 원하는 값 주위에 매달려 있었고 멈추기 전에 3.1409에 훨씬 가깝습니다. 흥미롭고 재미있다! 고맙습니다!

2

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;}

컨텍스트 : wiki , here and here .

1
Borwein, Bailey 및 Plouffe의 로그 상수에 대한 스피 곳 알고리즘이 마음에 들지만 코드 골프가 아니므로 코드를 다시 포맷하여 코드의 가독성을 향상시킬 수 있습니까? 또한 BPP 스타일 알고리즘은 최소한 추가 메모리를 사용하지 않고 2의 거듭 제곱 인 pi의 자릿수 만 출력 할 수 있습니다.
Franki

@Franki는 코드를 형식화하면 게시물의 의미 또는 의도가 변경됩니까? 그렇지 않다면 괜찮을 것입니다 (그리고 편집은 항상 롤백 될 수 있습니다). 일부 코드의 난독 처리가 명확화 이외의 다른 작업을 수행하는 방법을 모르겠습니다.
11684

1
@syntaxerror 중지하기 전에 정확히 15,000 자리를 생성해야합니다. 두 번째 for-loop의 출력은 4 자리수의 pi를 생성하고 미스테리 수는 52514로 14 씩 줄입니다. 방정식은 4 * (52514/14)이며 15004와 같습니다. 배열의 마지막 14 개 값은 무시됩니다. 적은 수의 토큰의 장점은 15000 우리의 정확한 값 얻을
다니엘 Henneberger

1
@ 11684 아니요, 실제로 코드의 의미 나 의도를 바꾸지 않습니다. 그러나 나는 이것이 pi에 대한 BBP 스타일 스피 곳 알고리즘이 아니라 다른 누군가가 이미 난독 처리 한 다른 알고리즘이라는 것을 깨달았습니다. stackoverflow.com/a/25837097
Franki

2

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 자리 이상으로 계산할 수있는 소프트웨어


1

다음은 사용자가 지정한 자릿수 ( '.'포함)로 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

사람들 scalebc옵션으로 사용 하는 것을 보았지만 제 경우 ( bc 1.06.95)에는 올바른 값이 출력되지 않습니다.

$ echo "scale=5;4*a(1)" | bc -l
3.14156

마지막 숫자를 확인하십시오.


4
질문에 따르면, "인쇄 할 숫자를 지정하고 싶습니다."라고 말하면 엄밀히 말하면 모호합니다. 그러나 합리적인 해석하에 (기술적으로) 귀하의 답변이 실패한다고 생각합니다. 당신 ./pi.sh 10의 초기 값을 세는 9 자리를 인쇄합니다 3. 또한 반올림 오류의 손가락을 가리키고 있지만 ./pi.sh 6출력 3.1415이 최적이 아닐 수 있습니다.
G-남자 '는 분석 재개 모니카'말한다

메모리에서 scale=X옵션은 bc숫자를 반올림하지 않지만 단순히 X 번째 십진수로 숫자를 자릅니다.
syntaxerror

1

나는 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

62 자리의 스케일 후에는 모두 0이지만 원래 명령에서는 발생하지 않습니다.

2
@ Amphiteót, 이는 printf에 비해 부동 소수점 숫자에 심각한 제한 이 있기 때문 bc입니다. 그것들은 약 17 자리의 정밀도 로 C 언어 double유형 으로 표현 되므로 약 17 번째 자리 이후의 0이 아닌 자리도 가짜입니다! ------에 의해 제한되지 않는 결과의 올바른 반올림으로 답변을printf 추가 했습니다 . ------ 또한이 명령이 다양한 로케일에서 작동하도록하려면 다음과 같이해야합니다. LC_ALL=C printf...
pabouk

1

당신이 당신의 인생을 위해 이것을 기억할 수 없다면 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을 쉽게 사용할 것이다.
John WH Smith

글쎄, 개인 취향의 문제라고 생각합니다. :) 전화 번호를 쉽게 암기 할 수있는 사람들은 전화 번호 하나만으로 두 번호를 외울 수 있습니다. 또한 학교에있는 사람들이 악의 세력으로 삼각법을 만들어야한다고 느꼈을 때 도움이 될 것입니다.
syntaxerror

1

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같은 일반적인 쉘에 내장 된 쉘 이기 때문에 프로세스를 생성하지 않습니다. 또한 어떤 종류의 부동 소수점 관련 코드도 건드리지 않고 바이트 배열 만 조작합니다 (명시 적으로 멀티 바이트 문자는 아님). 일반적으로 부동 소수점을 사용하는 것보다 훨씬 빠릅니다.bashzsh

printf 호환성

종종, 대체 이유가 printf에 의해 /usr/bin/printf보장 일관성이나 호환성에가. 이 경우 내장 기능을 사용할 수 있다고 생각합니다.이 기능을 사용 /usr/bin/printf하면 프로세스를 포크하여 "빠른"이점을 줄일 수 있습니다. 호환성
의 일반적인 문제 printf는 로캘에 따라 숫자 출력 형식입니다. .숫자 구분 은 ,로케일 설정 에 따라 변경 될 수 있습니다 . 그러나 .로케일에 영향을받지 않는 리터럴을 포함하는 문자열 상수 만 사용합니다 .
StéphaneChazelas는 printf %.5s다른 방식으로 작동 한다고 지적했습니다 .zsh평소와 같이 바이트가 아닌 문자를 계산하여. 운 좋게도 상수 UTF-8는 고정 너비 인코딩이 아닌 유니 코드에 공통 인코딩을 사용하는 한 ASCII가 낮은 하위 범위의 문자 만 사용합니다.이 인코딩은 관련 인코딩에서 문자 당 1 바이트로 인코딩됩니다.


참고 printf %.5szsh을 (현명하지만, POSIX에 대한)에 기반을 둔 문자 (안 바이트)입니다. ksh93%.5Ls그래프 기반입니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.