dc

Материал из Википедии — свободной энциклопедии
(перенаправлено с «Dc (UNIX)»)
Перейти к навигации Перейти к поиску

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]sy
0sa1
lyx

Квайн (программа, которая выводит саму себя):

[91Pn[dx]93Pn]dx

[91PP93P[dx]P]dx
  • dc(1) — страница справки man по пользовательским командам FreeBSD  (англ.)
  • bc(1) — страница справки man по пользовательским командам FreeBSD  (англ.)