Як надрукувати pi (3.14159)? [зачинено]


35

Яка команда могла надрукувати pi для мене? Я хочу вказати, скільки цифр він друкує, я нічого не міг знайти в Інтернеті. Я просто хочу мати можливість друкувати пі.



4
Зауважте, що вам стає веселіше, якщо вам потрібно більше цифр, ніж близько 15.
Thorbjørn Ravn Andersen

2
@DisplayName: це означає, що ви більше не можете використовувати будь-яку програму, яка внутрішньо зберігає / обчислює PI, використовуючи подвійну точність значень з плаваючою комою (що, як правило, "вбудований" тип даних FP, що має найвищу точність, доступний у більшості мов).
Маттео Італія

5
Моє рішення, десятиліття тому до того, як це зазвичай забезпечували мовні бібліотеки, полягало в запам'ятовуванні його в більшій кількості місць, ніж коли-небудь знадобиться плаваючі точки, які я використовував: 3.1415926535897932384626 зазвичай досить близький для практичних цілей, і навіть більшість непрактичних - нічого реального -світ буде мати більше помилок, ніж в інших числах, і для теоретиків я б дотримувався символічного, а не числового значення.
кешлам

3
@syntaxerror інтерес не має значення. Якби ви розмістили запитання про голосні фотографії знаменитостей, це отримало б тисячі переглядів і, можливо, підсумків. Це не робить це на тему. Це питання є класичним прикладом занадто широкого. Подивіться лише кількість відповідей. Також зауважте, що ОП не вказала жодних обмежень, що робить можливі відповіді по суті нескінченними. У будь-якому випадку закриття не видаляється. Питання та всі його 23 відповіді все ще знайдуться тут. Закриття просто означає, що більше відповідей не приймається. Чи справді нам потрібно ще більше способів друкувати π?
тердон

Відповіді:


52

Ви можете використовувати цю команду:

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/


12
Скорочений варіант в bashі інші оболонки , що підтримують тут рядки: bc -l <<< "scale=5; 4*a(1)".
пабук

2
Цікаво, скільки цифр може піти на це?
DisplayName

4
@DisplayName досить багато. scale=1000дає 999 правильних цифр досить швидко (остання цифра вимикається на 1, розумно, оскільки ми обчислюємо pi / 4, а потім множимо на 4). scale=4000дає 4000 правильних цифр за кілька секунд. scale=10000займає більше часу, ніж я маю терпіння, але, ймовірно, дає 9999 або 10000 правильних цифр.
варення

4
Це дає неправильний результат на моїй машині, набравши шкала "ехо" = 5; 4 * a (1) "| bc -l 'повертає 3.14156, коли остання цифра повинна бути до 9
Джордан Бентлі


61

Якщо ви tex(1)встановили:

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

13
Це майже коштує грошей лише за те, що ви розумні. Хоча результат цього зміниться, коли ви оновите пакет. Чи можемо ми вважати це функцією чи помилкою?
CVn

8
@ MichaelKjörling Власне, це змінюється на більш точне наближення pi.
Abrixas2

@ Abrixas2 Так, я знаю. Остання версія TeX - версія π.
CVn

30
@DavidRicherby Менше цифр можна надрукувати за допомогою додаткового виклику cut. Більше цифр можна надрукувати, якщо довго чекати і знову запустити команду.
Стівен Д

1
@Ruslan залежить від реалізації. Я б очікував у цьому конкретному випадку, що це буде зроблено «правильно».
Thorbjørn Ravn Andersen

23

Для друку з довільною точністю можна використовувати bcі формулу pi = 4*atan(1):

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

2
Є щось смішне у scaleваріанті, pi = 3.141592..але з чим echo "scale=5; 4*a(1)" | bc -l => 3.14156я б тоді очікував побачити 3.14159?
fduff

7
scaleвизначає точність використання для обчислення, тому при scale=5жодній операції не буде використано більше п'яти дробових цифр для будь-якої атомної операції.
Abrixas2


20

Якщо ви хочете щось, що може обчислити значення π, то існує кілька підходів. Мабуть, найбільш очевидним рішенням буде використання готового пакету типу pi(посилання пакета Debian) , який, якщо довіряти опису пакету Debian, може обчислити значення довільної точності, обмеженої лише пам'яттю.

piнасправді є прикладом, який входить до бібліотеки CLN (Бібліотека класів для чисел) . Він включає приклади програм, які надають інструменти для генерації довільних довжин чисел, таких як Pi, Fibach і т.д. Пакети CLN доступні заздалегідь упакованими в Debian / Ubuntu (саме на це вказує посилання Debian вище).

Приклади
$ ./pi 10
3.141592653

$ ./pi 20
3.1415926535897932384

ПРИМІТКА . Джерело цих прикладів знаходиться тут у джерелі для бази коду CLN .

Інші дистрибуції

Fedora

На Fedora мені довелося завантажити вихідний тарбол і створити його самостійно, але він створюється з невеликою суєтою. З будь-якої причини пакет clnFedora включає лише бібліотеку, але нехтує прикладами, доступними у версії Debian / Ubuntu (вище).

Арк

Arch забезпечує ту ж програму в на clnупаковці (спасибі Amphiteót ).


Так, хе, я мав на увазі загальну цінність, яку я просто набрав, що мав у голові.
DisplayName

2
"Загальне значення" ?? Значить, що ...?
Кайл Странд

2
@DisplayName прочитав решту відповіді. Спеціальна програма на зразок piзвучить як саме те, що ви шукаєте. Можна, наприклад, pi 300надрукувати перші 300 цифр.
terdon

3
@KyleStrand Я виявив по-справжньому чудову відповідь на це, що цей коментар є занадто вузьким, щоб містити. Гей, це працювало на Ферма !
тердон

Мені б хотілося дізнатись, чому це отримало дві голоси. Невже люди, які схилялися до уваги, не читали відповіді, перш ніж вирішили, що це не корисно?
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).
CodesInChaos

1
@CodesInChaos Ні, час завантаження є постійним (з урахуванням постійної швидкості передачі), оскільки ви завантажуєте постійну кількість цифр (один мільйон, тут). Якщо (в даному конкретному випадку) згортання не є достатньо розумним для друку під час завантаження та припинення завантаження, коли труба розривається, тому що 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. Це не має обмеження команди, 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

2
Обчислення трьох додаткових цифр для округлення не є «правильним округленням», як ви заявляєте в коментарі. По-перше, ви не пов'язані з помилкою обчислення. Якщо він може помилятися на 3 одиниці в останньому місці, як стверджує fduff, чому б не помилитися з 1000 одиницями на останньому місці? По-друге, див. "Дилему виробника столів".
Складні дивіться біо

12

perl один рядок (використовуючи bignum ):

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

напр

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

Для 10 000 цифр: близько 8 хвилин в перл, менше 4 в до. Не найшвидший.
Ісаак

9

З python2:

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

4
Для повноти це рішення є специфічним для python2.
HalosGhost

Після редагування, (..)це працює в Python 2 і 3. Тільки, здається, має 12 цифр.
Антон

$ Пітон -c "імпорту математики, друк (формат (math.pi, '.400f'))" 3,1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Артем Шитов

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
Найшвидший я міг знайти from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)лише пару секунд на мільйон цифр. Зовсім непогано !!!.
Ісаак

7

Використання Ruby:

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встановити. Тут, на Ubuntu (& ароматизаторів), це не стандартно. JFYI.
синтаксичний помилок

@syntaxerror Дякую, хороший момент! Я зняв свій приклад. Моя думка була якраз тоді, коли я прочитав цей AI, пробіг grepпо моїй системі, шукаючи константу і знайшов її в більш ніж одному місці. Тому для мене це було +1!


3

Як я пропустив це питання ...

Ось моя маленька програма 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) протягом двох секунд на мільйон цифр. Зовсім непогано !!!.
Ісаак

2

Якщо ви 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

4
Коротше node -e 'console.log(Math.PI)'трохи краще, ніж найкраще.
chbrown

1
@chbrown Це не відповідає "несерйозним" вимогам ОП.
Пол

1
Яка "несерйозна" вимога? ОП просто заявила, що вони просять розваг не те, що хочуть відповідей, які якимось чином "несерйозні". Що це все-таки означає? Щось схоже echo pie?
terdon

Я набрав це, тому що, коли ви задаєте питання, іноді люди кажуть, що "це не фабрика написання сценарію", тому я сказав, що тому, що для цього немає реальної причини, я просто хочу знати, як друкувати пі.
DisplayName

@ Amphiteóth На моєму комп’ютері потрібно близько 20 секунд. Можливо, вам просто потрібно буде приділити це деякий час.
Павло

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і цифри після цього продовжували коливатися, ніколи не збігаючись. Це, мабуть, тому, що через деякий час ПРНГ починає повторюватися. Застосування srandдозволить уникнути того, щоб принаймні продовжити період псевдовипадкової послідовності. Це все здогади, тому сміливо виправляйте мене, якщо я помиляюся.


@ Amphiteót Не дуже впевнений, що там відбувається. Якщо це допоможе моєму Perl є v5.14.2. Я не дуже добре обізнаний з bignumопераціями в Perl, боюся, і не знаю жодної конкретної частини вищевказаної програми, яка потребувала б новішої Perl. У будь-якому випадку, що цікаво в цьому, це сам алгоритм. Спробуйте впровадити його на вибраній мовою, якщо ця Perl не працює для вас.
Джозеф Р.

1
@ Amphiteót Я бачу. Чи редагування вирішує вашу проблему?
Джозеф Р.

@ Amphiteót Ви можете спробувати додати ($x,$y,$circle,$not_circle)=(0,0,0);перед циклом, щоб переконатися, що всі змінні визначені перед використанням.
Джозеф Р.

@ Amphiteót Моя помилка. Парені вище повинні були бути (0,0,0,0).
Джозеф Р.

Re this /5.20.1: Має сенс, але цього не бачив! Справді ($x,$y,$circle,$not_circle)=(0,0,0,0). Через хвилину-дві він звисав навколо потрібного значення, тоді він підходив набагато ближче до 3.1409, перш ніж я зупинився. Цікаво та весело! Дякую!

2

Для 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;}

Контекст: wiki , тут і тут .

1
Мені подобається алгоритм спіготів для логарифмічних констант Борвейна, Бейлі та Плоуффа, однак це не кодовий гольф, тож чи можу я покращити читабельність вашого коду, переформатувавши його? Також зауважте, що алгоритми стилю BPP можуть виводити цифри для pi лише в базах, що мають потужність 2, принаймні, без використання додаткової пам'яті.
Франки

@Franki чи форматування коду змінить значення чи намір публікації? Якщо ні, то це повинно бути добре (і редагування завжди можна повернути назад). Я не бачу, як знешкодження якогось коду могло б зробити щось інше, ніж з’ясувати.
11684

1
@syntaxerror Потрібно створити рівно 15 000 цифр перед зупинкою. Вихід у другому циклі for-циклу створює 4 цифри pi та зменшує число таємниці 52514 на 14. Рівняння тоді буде 4 * (52514/14), що дорівнює 15004. Останні 14 значень масиву ігноруються, щоб прийняти перевага меншої кількості жетонів, щоб отримати наше точне значення 15000.
Даніель Геннебергер

1
@ 11684 Ні, це дійсно не змінило б значення чи намір коду. Однак я зрозумів, що це не алгоритм стилю BBP-стилю для pi, а інший, який ще хтось тут знешкодив 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();'

Розмір поплавця залежить від платформи, хоча максимум ~ 1,8e308 з точністю приблизно 14 десяткових цифр є загальним значенням (64-бітний формат IEEE). [читати далі]


Якщо ви шукаєте ще більш точну точність, перевірте код Rosetta або Code Golf SE на деякі програмні рішення.

Пов'язане: Програмне забезпечення, яке може обчислити PI принаймні до тисячі цифр на SR.SE


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

Я бачив людей, які використовують scaleяк bcваріант, але в моєму випадку ( bc 1.06.95) це не виводить правильне значення:

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

Помітьте останню цифру.


4
Питання говорить: "Я хочу вказати, скільки цифр він друкує", що, строго кажучи, неоднозначно, - але я думаю, що ваша відповідь не відповідає (з технічної точки зору) під будь-яким розумним тлумаченням; ваші ./pi.sh 10відбитки дев'ять цифр, вважаючи первісний 3. Крім того, ви вказуєте пальцем на помилку округлення, але ./pi.sh 6результати 3.1415, які можуть бути не оптимальними.
G-Man каже: "Відновіть Моніку"

З пам'яті, scale=Xпараметр bcНЕ буде округляти число, а просто відрізати число на X-й десятковій цифрі.
синтаксичний помилок

1

Мені подобається відповідь Ебі, але мені не сподобалося, як bc змінює останню цифру.

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

Тому я видалив масштаб, що використовувався printf, щоб встановити кількість цифр.

printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159

Ви помітили, що за шкалою 62 цифри вони всі 0, тоді як це не відбувається з оригінальною командою.

2
@ Amphiteót, Це тому, printfщо є суворі обмеження на числа з плаваючою комою порівняно з bc. Вони представлені doubleтипом мови С з точністю близько 17 цифр, тому навіть ненульові цифри після приблизно 17-ї є хибними! ------ Я додав відповідь з правильним округленням результату, не обмеженимprintf . ------ Для того, щоб ця команда працювала з різними LC_ALL=C printf
локалями,

1

Що робити, якщо ви не можете все життя запам'ятати цю 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.
Джон У. Сміт

Ну, я думаю, це питання особистої переваги. :) Люди (як я), які легко запам'ятовують (стаціонарні!) Номери телефонів, зможуть запам'ятати два номери так само, як один єдиний номер телефону. Це також допоможе тим людям, хто в школі відчув, що тригонометрію, можливо, створили злі сили.
синтаксичний помилок

1

Можна припустити, що ОП цікавить коротка, проста запам'ятована команда оболонки для друку π - але питання насправді цього не говорить. Ця відповідь ігнорує це припущення і відповідає на запитання строго так, як написано;

Тривіальний?

Хоча вже є 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

Часто є підстави замінити printf, /usr/bin/printfщоб гарантувати послідовність або сумісність. У цьому випадку я думаю, що ми можемо використовувати вбудований - що важливо, оскільки використання /usr/bin/printfзменшує «швидку» перевагу за рахунок процесу.
Поширена проблема printfсумісності - це формат виводу номера залежно від локальної локації. Розділення .для чисел може бути змінено на ,основі налаштування місцевості; Але ми не використовуємо числа, а лише константа рядка, що містить літерал .- не впливає на локаль.
StéphaneChazelas зазначав, що в Росії printf %.5sпрацює інакшеzsh, підраховуючи символи, а не байти, як зазвичай. На щастя, наші константи використовують лише символи нижнього діапазону ASCII, який кодується одним байтом на символ у будь-якому відповідному кодуванні, якщо ми використовуємо загальне UTF-8кодування для Unicode, а не кодування фіксованої ширини.


Зауважте, що printf %.5schar (не байт) базується на zsh (розумно, але проти POSIX). ksh93's %.5Lsна основі графем.
Стефан Хазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.