dc
dc (deskcalculator) — пакет для арифметических вычислений с произвольной точностью вunix-системах. Обычно он оперирует вдесятичной системе счисления с целыми числами, однако можно задать системы счисления для ввода и вывода, а также точность вычислений. Общая структура dc —стековый калькулятор, использующийобратную польскую запись. Если аргумент указан, то сначала ввод производится из файла, а потом со стандартного ввода.
Допустимые операции
[править |править код]dc распознаёт следующие конструкции:
число | Значение числа помещается в стек. Число — непрерывная цепочка цифр 0-9 или букв A-F (шестнадцатеричные цифры). В начале её может стоять знак подчеркивания_ для ввода отрицательного числа. Число может содержать десятичную точку. Последовательность цифр может быть даже пустой, если "число" содержит хотя бы знак подчеркивания или десятичную точку (странные представления нуля). |
---|---|
+ - / * % ^ ~ | Верхние два числа стека складываются (+ ), вычитаются (- ), умножаются (* ), делятся (/ ), берётся остаток (% ), выполняется возведение в степень (^ ) или совершается деление с остатком (~ ).
|
sx, Sx | Извлекается вершина стека и помещается в регистр с именемx , гдеx — любойсимвол ASCII. Если конструкция имеет видSx , тоx рассматривается как стек, в который и помещается извлечённое значение. |
lx, Lx | Значение, хранящееся в регистреx , помещается в стек. Регистрx не изменяется. Изначально все регистры инициализируются нулём. Если конструкция имеет видLx , тоx рассматривается как стек, его вершина извлекается и помещается в главный стек. |
d | Вершина стека удваивается. |
p | Выводится вершина стека (без удаления из стека). |
P | Если вершина стека цепочка символов, она печатается и удаляется из стека. Если вершина стека явлается числом, то оно печатается как последовательность байтов и удаляется из стека. |
f | Выводятся все элементы стека (без удаления). Удобно дляотладки программы. |
q | Завершает работу программы. При выполнении цепочки символов уровень рекурсии уменьшается на два. |
Q | Завершает работу программы. Вершина стека извлекается и уровень рекурсии уменьшается на полученное значение. |
x | Вершина стека трактуется как цепочка символов, содержащая dc-команды, и выполняется. |
X | Вершина стека заменяется количеством цифр в её дробной части. |
[..] | Цепочка символов, заключённая в скобки, помещается в вершину стека. |
=x | Два верхних элемента стека извлекаются и сравниваются. Если они удовлетворяют указанному условию, то содержимое регистра x рассматривается как команда dc и выполняется. Можно использовать также знаки сравнения как< и> и их отрицания!< и!> . |
v | Верхний элемент стека заменяется квадратным корнем из него. Если он имел дробную часть, то она учитывается; в противном случае точность вычислений зависит от командыk . |
! | Остаток строки интерпретируется как команда shell’а. |
c | Очистка стека. |
i | Вершина стека извлекается и используется как основание системы счисления при вводе. Команда I помещает используемое при вводе основание системы счисления в вершину стека. |
o | Вершина стека извлекается и используется как основание системы счисления при выводе. Команда O помещает используемое при выводе основание системы счисления в вершину стека. |
k | Извлекается вершина стека; она используется для задания точности вычислений: количества знаков в дробной части при выводе и при выполнении умножения, деления, возведения в степень и извлечения корней. |
z | В стек помещается количество его элементов. |
Z | Число в вершине стека заменяется его длиной (без учёта десятичной точки, знака минус и ведущих нулей, даже если они за десятичной точкой). |
? | Со стандартного ввода вводится одна строка и исполняется. |
;: | Используются dc для операций с массивами. |
Примеры использования
[править |править код]Вывести факториалы первых 10 натуральных чисел:
[la1+dsa*pla10>y]sy0sa1lyx
Квайн (программа, которая выводит саму себя):
[91Pn[dx]93Pn]dx[91PP93P[dx]P]dx
Печатать текст (Крылатая фраза)
dc -e '16iD09BD183D187D188D0B520D1P81D0BAD0B0D0B6D0B820D0BCD0B0D0BBD0BE2CP20D0BDD0BE20D185D0BED180D0BED188D0BE2EP'