Lệnh nào có thể in pi cho tôi? Tôi muốn chỉ định có bao nhiêu chữ số in, tôi không thể tìm thấy bất cứ điều gì trực tuyến. Tôi chỉ muốn có thể in pi.
Lệnh nào có thể in pi cho tôi? Tôi muốn chỉ định có bao nhiêu chữ số in, tôi không thể tìm thấy bất cứ điều gì trực tuyến. Tôi chỉ muốn có thể in pi.
Câu trả lời:
Bạn có thể sử dụng lệnh này:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Trong đó tỷ lệ là số chữ số sau dấu thập phân.
Tham khảo: http://www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
và các shell khác hỗ trợ chuỗi ở đây : bc -l <<< "scale=5; 4*a(1)"
.
scale=1000
cung cấp 999 chữ số chính xác khá nhanh chóng (chữ số cuối cùng tắt đi 1, hợp lý vì chúng tôi đang tính toán pi / 4 và sau đó nhân với 4). scale=4000
đưa ra 4000 chữ số chính xác trong vài giây. scale=10000
mất nhiều thời gian hơn tôi có kiên nhẫn, nhưng có thể đưa ra 9999 hoặc 10000 chữ số chính xác.
Nếu bạn đã tex(1)
cài đặt:
tex --version | head -1 | cut -f2 -d' '
cut
. Nhiều chữ số có thể được in bằng cách chờ đợi một thời gian dài và chạy lại lệnh.
Để in với độ chính xác tùy ý, bạn có thể sử dụng bc
và công thức pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
tùy chọn, pi = 3.141592..
nhưng với echo "scale=5; 4*a(1)" | bc -l => 3.14156
tôi sau đó tôi sẽ thấy 3.14159
?
scale
chỉ định độ chính xác để sử dụng để tính toán, do đó scale=5
, không có hoạt động nào sẽ sử dụng nhiều hơn năm chữ số phân số cho bất kỳ hoạt động nguyên tử nào.
Nếu bạn muốn một cái gì đó có thể tính giá trị của π, thì có một số cách tiếp cận. Có lẽ giải pháp rõ ràng nhất là sử dụng gói được tạo sẵn như pi
(liên kết gói Debian) , nếu mô tả gói của Debian đáng tin cậy có thể tính giá trị theo độ chính xác tùy ý, chỉ giới hạn bởi bộ nhớ.
pi
thực sự là một ví dụ được bao gồm trong thư viện CLN (Thư viện lớp cho số) . Nó bao gồm các ứng dụng ví dụ cung cấp các công cụ để tạo các số có độ dài tùy ý như Pi, Fibonacci, v.v. Các gói CLN có sẵn được đóng gói sẵn trong Debian / Ubuntu (đó là những gì liên kết Debian ở trên đang trỏ đến).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
LƯU Ý: Nguồn của các ví dụ này có ở đây trong nguồn cho cơ sở mã CLN .
Trên Fedora tôi đã phải tải tarball nguồn và tự xây dựng nó, nhưng nó xây dựng với một chút phiền phức. Vì bất kỳ lý do gì, gói cln
trên Fedora chỉ bao gồm thư viện nhưng bỏ qua các ví dụ có sẵn trong phiên bản Debian / Ubuntu (ở trên).
Arch cung cấp các chương trình tương tự trong các cln
gói (nhờ Amphiteót ).
pi
âm thanh giống như chính xác những gì bạn đang tìm kiếm. Bạn có thể làm những việc như pi 300
in 300 chữ số đầu tiên chẳng hạn.
Để có tới một triệu chữ số, bạn có thể sử dụng như sau (ở đây cho 3000 chữ số):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
thoát? Nếu đó là trường hợp, tôi đồng ý, nó sẽ là O (n).
Một số câu trả lời khác hiển thị chữ số không chính xác ở vị trí cuối cùng của đầu ra. Dưới đây là một biến thể của câu trả lời bằng cách sử dụngbc
nhưng với kết quả được làm tròn chính xác. Biến s
chứa số chữ số có nghĩa (bao gồm 3
ở phía trước dấu thập phân).
$ 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
Việc làm tròn được thực hiện trực tiếp trong bc
. Điều này không có giới hạn của lệnh printf
sử dụng biểu diễn double
loại ngôn ngữ C cho các số có độ chính xác khoảng 17 chữ số có nghĩa. Xem câu trả lời với printf
làm tròn .
scale=s-1
đặt số lượng chữ số để cắt ngắn. pi/1
chia kết quả cho 1 để áp dụng cắt ngắn. Đơn giản pi
không cắt bớt số.
Làm tròn một nửa yêu cầu thêm 5 vào chữ số đầu tiên sẽ bị cắt (5 × 10 -s ) để trong trường hợp các chữ số cao hơn bằng 5, chữ số cuối sẽ còn lại sẽ được tăng lên.
Từ các bài kiểm tra của hobbs , dường như ba chữ số bổ sung sẽ được làm tròn / cắt ( scale=s+2
) sẽ đủ ngay cả đối với các số rất dài.
Những ví dụ trên sử dụng ở đây chuỗi được hỗ trợ ví dụ như trong bash
, ksh
và zsh
. Nếu shell của bạn không hỗ trợ ở đây, sử dụng chuỗi echo
và đường ống thay thế:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
Với python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
điều này hoạt động trong Python 2 và 3. Chỉ có 12 chữ số.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
. Tăng độ chính xác để biết thêm chữ số ... ví dụpython -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
chỉ là một vài giây cho một triệu chữ số. Không xấu cả !!!.
Trong bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
yêu cầu groff
phải được cài đặt. Ở đây trên Ubuntu (& hương vị), nó không chuẩn. JFYI.
Làm thế nào tôi bỏ lỡ câu hỏi này ...
Đây là một chương trình Python pi nhỏ của tôi mà tôi đã đăng vài tuần trước trên Stack Overflow. Nó không đặc biệt nhanh, nhưng nó có thể tạo ra rất nhiều chữ số. :) Tuy nhiên, như tôi đã đề cập trong chủ đề đó, tôi thường sử dụng mô đun mpmath của Python cho số học chính xác tùy ý và mpmath có một trình tạo pi khá nhanh.
Ví dụ,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
IMHO 500000 số thập phân dưới 5 giây không quá tồi tệ, IMHO, xem xét nó chạy trên một máy có bộ xử lý 2 GHz lõi đơn, 2 GB RAM và ghi vào ổ đĩa IDE cũ.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(sau khi cài đặt pip3 mpmath) dưới hai giây cho một triệu chữ số. Không xấu cả !!!.
Nếu bạn đã node.js
cài đặt, điều này sẽ làm hết sức mình trong việc tìm kiếm pi cho bạn, mặc dù điều tốt nhất của nó không phải là rất tốt:
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)'
Đầu ra mẫu:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
là một chút tốt hơn so với tốt nhất của nó.
echo pie
nào?
Phương pháp Monte Carlo
Xem, ví dụ, điều này để giải thích về phương pháp này.
Hãy cẩn thận
Ưu điểm
Vui vẻ :-)
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
}'
Lưu ý: Lần đầu tiên tôi đã thử nó mà không srand
bị kẹt 3.14
và các chữ số sau đó cứ dao động, không bao giờ hội tụ. Điều này có lẽ là vì, sau một thời gian PRNG bắt đầu lặp lại. Việc sử dụng srand
sẽ tránh điều đó hoặc ít nhất là kéo dài thời gian của chuỗi giả ngẫu nhiên. Đây chỉ là phỏng đoán, vì vậy hãy sửa tôi nếu tôi sai.
bignum
hoạt động trong Perl, tôi sợ và tôi không biết bất kỳ phần cụ thể nào của chương trình trên yêu cầu Perl mới hơn. Dù sao, điều thú vị về điều này là chính thuật toán. Hãy thử triển khai nó bằng ngôn ngữ bạn chọn nếu Perl này không phù hợp với bạn.
($x,$y,$circle,$not_circle)=(0,0,0);
trước vòng lặp để đảm bảo tất cả các biến được xác định trước khi sử dụng.
(0,0,0,0)
.
($x,$y,$circle,$not_circle)=(0,0,0,0)
. Sau một hoặc hai phút, nó được treo xung quanh giá trị mong muốn, sau đó nó tiến gần hơn đến 3.1409 trước khi tôi dừng lại. Thú vị và vui vẻ! Cảm ơn bạn!
Bạn có thể sử dụng thuật toán spigot cho pi. Chương trình C sau đây của Dik Winter và Achim Flammenkamp sẽ tạo ra 15.000 chữ số đầu tiên của pi, mỗi chữ số một chữ số.
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
Một vài ví dụ:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Nếu bạn muốn thay đổi độ chính xác, hãy thử:
php -d precision=100 -r 'echo pi();'
Kích thước của một float là phụ thuộc vào nền tảng, mặc dù tối đa ~ 1,8e308 với độ chính xác khoảng 14 chữ số thập phân là một giá trị phổ biến (định dạng IEEE 64 bit). [đọc thêm]
Nếu bạn đang tìm kiếm độ chính xác thậm chí chính xác hơn, hãy kiểm tra Rosetta Code hoặc Code Golf SE để biết một số giải pháp lập trình.
Liên quan: Phần mềm có thể tính PI đến ít nhất một nghìn chữ số tại SR.SE
Đây là tập lệnh in pi với số chữ số được chỉ định (bao gồm '.') Bởi người dùng.
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
đầu ra
$ ./pi.sh 10
3.14159265
và với giá trị mặc định:
$ ./pi.sh
3.14159
Tôi đã thấy mọi người sử dụng scale
như một bc
tùy chọn, nhưng trong trường hợp của tôi ( bc 1.06.95
) điều này không tạo ra giá trị chính xác:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Chú ý chữ số cuối cùng.
./pi.sh 10
in chín chữ số của bạn , đếm số ban đầu 3
. Ngoài ra, bạn đang chỉ ngón tay của lỗi làm tròn, nhưng ./pi.sh 6
kết quả đầu ra của bạn 3.1415
, có thể không tối ưu.
scale=X
tùy chọn bc
sẽ KHÔNG làm tròn số, mà chỉ cần cắt bỏ số ở chữ số thập phân X-th.
Tôi thích câu trả lời của Abey nhưng không thích cách bc thay đổi chữ số cuối cùng.
echo "scale=5; 4*a(1)" | bc -l
3.14156
Vì vậy, tôi loại bỏ quy mô sử dụng printf để đặt số chữ số.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
có một hạn chế nghiêm trọng về số lượng dấu phẩy động so với bc
. Chúng được biểu thị bằng double
loại ngôn ngữ C với độ chính xác khoảng 17 chữ số, do đó, ngay cả các chữ số khác không sau khoảng 17 chữ số là không có thật! ------ Tôi đã thêm một câu trả lời với làm tròn chính xác kết quả không bị giới hạn bởiprintf
. ------ Ngoài ra để đảm bảo rằng lệnh này hoạt động với nhiều địa phương khác nhau, bạn phải làm một cái gì đó như thế này: LC_ALL=C printf
...
Điều gì nếu bạn không thể cho cuộc sống của bạn nhớ điều này arctan
? Hoặc giả sử bạn thậm chí không biết chức năng này tồn tại bc
, sau đó thử ghi nhớ cách phân chia đơn giản này:
echo "scale=6; 355 / 113" | bc
3.141592
Sẽ chỉ hoạt động cho 6 chữ số, nhưng đối với các tính toán không khoa học, điều này sẽ làm tốt.
Nếu bạn nghĩ rằng bạn không thể nhớ hai số này, hãy viết mẫu số trước, sau đó là tử số:
113 355
Hay tại sao không
11 33 55
"gấp đôi 1, gấp đôi 3, gấp đôi 5". Tất cả các số liệu là số lẻ. Để tính toán, hãy chia một nửa số có 6 chữ số và hoán đổi mẫu số và tử số trước khi chia chúng. Đó là về nó.
4 * arctan(1)
dễ dàng hơn rất nhiều khi nhớ rằng 2 số có ba chữ số ... Tôi dễ dàng sử dụng 335 thay vì 355 hoặc 133 thay vì 113.
Có thể giả định rằng OP quan tâm đến lệnh shell ngắn, dễ nhớ để in π - nhưng câu hỏi không thực sự nói lên điều đó. Câu trả lời này là bỏ qua giả định đó và trả lời câu hỏi đúng như được viết;
Mặc dù đã có 18 câu trả lời, một cách tiếp cận vẫn còn thiếu - và với rất nhiều câu trả lời, người ta có thể nghĩ rằng đó không phải là câu trả lời duy nhất còn thiếu:
Cách tiếp cận tầm thường: Làm thế nào để in π? Chỉ cần in π!
Cách tiếp cận đó dường như quá vô dụng để thậm chí không nghĩ về nó, nhưng tôi sẽ chỉ ra rằng nó thực sự có ý nghĩa:
Chúng ta thường tính giá trị của π. Tôi không thấy những gì ngăn cản chúng tôi tối ưu hóa giải pháp, bằng cách tính toán trước giá trị - đó là một hằng số, bất kỳ trình biên dịch nào cũng sẽ làm điều đó.
Chúng tôi muốn một số chữ số của số pi, lên đến độ chính xác tối đa. Vì vậy, chúng ta chỉ có thể lấy tiền tố của hằng số, dưới dạng văn bản:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Một biến thể với một đối số rõ ràng cho độ chính xác, ví dụ. cho chính xác 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
Độ chính xác tối đa có thể được chọn tùy ý bằng cách sử dụng hằng số phù hợp được tính bằng một trong những câu trả lời khác. Nó chỉ bị giới hạn bởi độ dài tối đa của một dòng lệnh.
Nó có độ phức tạp thời gian liên tục để tìm giá trị.
Nó làm cho tất cả các giới hạn và ràng buộc rõ ràng, dựa trên mức độ phức tạp thấp của việc thực hiện.
Nó xử lý độ chính xác lớn hơn mức tối đa một cách duyên dáng bằng cách trả về hằng số trong độ chính xác có sẵn đầy đủ (không có dấu vết 0
).
Vì vậy, giải pháp này, trong khi tầm thường, có lợi thế. Nó có thể hữu ích khi nó được sử dụng trong hàm shell chẳng hạn.
Chức năng của giải pháp trên cũng có thể được thực hiện mà không cần tạo quy trình cho cut
(giả sử echo
là một vỏ dựng sẵn). Nó sử dụng lệnh printf
(thường là dựng sẵn) theo cách hơi tối nghĩa:
Hằng số được xử lý hoàn toàn dưới dạng một chuỗi (định dạng sử dụng %s
), không có arithmethic dấu phẩy động liên quan, do đó các giới hạn float
hoặc double
không áp dụng ở đây.
Giá trị chính xác của %s
lối thoát ( 5
trong ví dụ bên dưới) chỉ định độ dài của tiền tố chuỗi cần in - đó là độ chính xác. Đây 3.
là một phần của printf
định dạng để giữ cho nó ra khỏi tính toán chính xác.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Thay thế với độ chính xác như đối số riêng biệt:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
Hoặc dễ đọc hơn một chút (Lưu ý khoảng trắng giữa 3.
và 14159...
, chúng là các đối số riêng biệt):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
Biến thể sử dụng printf
có thể được dự kiến sẽ rất nhanh: Bởi vì printf
một shell được tích hợp trong các shell thông thường như bash
và zsh
, nó không tạo ra bất kỳ quy trình nào.
Ngoài ra, nó không chạm vào bất kỳ loại mã liên quan đến dấu phẩy động nào, mà chỉ thao tác với các mảng byte (rõ ràng không phải là các ký tự đa dòng). Điều này thường nhanh hơn, thường nhanh hơn nhiều so với việc sử dụng dấu phẩy động.
Thông thường, có những lý do để thay thế printf
bằng /usr/bin/printf
để đảm bảo tính nhất quán hoặc tương thích. Trong trường hợp này, tôi nghĩ rằng chúng ta có thể sử dụng nội dung - điều này rất quan trọng, vì việc sử dụng /usr/bin/printf
làm giảm lợi thế "nhanh" bằng cách hủy bỏ một quy trình.
Một vấn đề phổ biến với printf
khả năng tương thích là định dạng đầu ra số tùy thuộc vào miền địa phương. Việc phân tách .
các số có thể được thay đổi thành ,
dựa trên cài đặt ngôn ngữ; Nhưng chúng tôi không sử dụng số, chỉ là một hằng chuỗi chứa một chữ .
- không bị ảnh hưởng bởi miền địa phương.
StéphaneChazelas chỉ ra rằngprintf %.5s
hoạt động khác nhau trongzsh
, bằng cách đếm các ký tự, không phải byte như bình thường. May mắn thay, các hằng số của chúng tôi chỉ sử dụng các ký tự trong phạm vi ASCII thấp hơn, được mã hóa bởi một byte cho mỗi ký tự trong bất kỳ mã hóa có liên quan nào, miễn là chúng tôi sử dụng UTF-8
mã hóa chung cho Unicode và không phải là mã hóa độ rộng cố định.
printf %.5s
char (không phải byte) dựa trên zsh (hợp lý, nhưng so với POSIX). ksh93
's %.5Ls
là dựa trên đồ thị.