dc

dc (desk calculator) — пакет для арифметических вычислений с произвольной точностью в unix-системах. Обычно он оперирует в десятичной системе счисления с целыми числами, однако можно задать системы счисления для ввода и вывода, а также точность вычислений. Общая структура dc — стековый калькулятор, использующий обратную польскую запись. Если аргумент указан, то сначала ввод производится из файла, а потом со стандартного ввода.

Допустимые операции

dc распознаёт следующие конструкции:

числоЗначение числа помещается в стек. Число — непрерывная цепочка цифр 0-9 или букв A-F (шестнадцатеричные цифры). В начале её может стоять знак подчеркивания _ для ввода отрицательного числа. Число может содержать десятичную точку.
+ - / * % ^ ~Верхние два числа стека складываются (+), вычитаются (-), умножаются (*), делятся (/), берётся остаток (%), выполняется возведение в степень (^) или совершается деление с остатком (~).

^: oба операнда извлекаются из стека и результат помещается обратно в стек. Дробная часть показателя степени игнорируется.

~: oба операнда извлекаются из стека, второй делится на первый, результат и остаток деления помещается в стек (операция SdSn lnld/ LnLd% дает такой же результат).

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(1) — страница справки man по пользовательским командам FreeBSD  (англ.)
  • bc(1) — страница справки man по пользовательским командам FreeBSD  (англ.)