dc
是一个逆波兰表示法(Reverse Polish Notation, RPN)的任意精度计算器,支持无限精度算术运算和宏定义功能。它采用堆栈结构进行计算,所有操作都通过堆栈进行。
基本语法
dc [选项] [文件...]
主要选项
选项 | 描述 |
---|---|
-V , --version | 显示版本信息并退出 |
-h , --help | 显示帮助信息并退出 |
-e script , --expression=script | 添加要执行的脚本命令 |
-f script-file , --file=script-file | 添加要执行的脚本文件 |
基本操作
数字输入
- 直接输入数字会压入堆栈
- 负号用
_
表示(-
用于减法运算) - 基数大于10时,使用A-F表示"数字"
打印命令
命令 | 描述 |
---|---|
p | 打印栈顶值(不改变堆栈) |
n | 打印并弹出栈顶值(不加换行) |
P | 弹出栈顶值并打印(字符串直接打印,数字按字节流打印) |
f | 打印整个堆栈内容 |
算术运算
命令 | 描述 | 示例 |
---|---|---|
+ | 加法 | 3 4 + p → 7 |
- | 减法 | 5 3 - p → 2 |
* | 乘法 | 2 6 * p → 12 |
/ | 除法 | 10 3 / p → 3 |
% | 取模 | 10 3 % p → 1 |
~ | 除法和余数 | 10 3 ~ p p → 3 1 |
^ | 幂运算 | 2 3 ^ p → 8 |
| | 模幂运算 | 10 3 2 | p → 9 |
v | 平方根 | 16 v p → 4 |
堆栈控制
命令 | 描述 | 示例 |
---|---|---|
c | 清空堆栈 | |
d | 复制栈顶值 | 4 d * p → 16 |
r | 交换栈顶两个值 | 3 4 r - p → 1 |
寄存器操作
命令 | 描述 | 示例 |
---|---|---|
sr | 将栈顶值存入寄存器r | 5 sa |
lr | 将寄存器r的值压入堆栈 | la |
Sr | 将栈顶值压入寄存器r的堆栈 | 5 Sa |
Lr | 将寄存器r堆栈的值弹出到主堆栈 | La |
参数设置
命令 | 描述 | 示例 |
---|---|---|
i | 设置输入基数 | 16 i (设置为十六进制) |
o | 设置输出基数 | 2 o (设置为二进制) |
k | 设置精度 | 5 k (设置5位小数精度) |
I | 获取当前输入基数 | I p |
O | 获取当前输出基数 | O p |
K | 获取当前精度 | K p |
字符串和宏
命令 | 描述 | 示例 |
---|---|---|
[chars] | 创建字符串 | [Hello] p → Hello |
a | 数字转ASCII字符或取字符串首字符 | 65 a p → A |
x | 执行宏 | [1p]x → 1 |
>r | 如果大于则执行寄存器r的宏 | 3 2 >a |
!>r | 如果不大于则执行 | 2 3 !>a |
<r | 如果小于则执行 | 2 3 <a |
!<r | 如果不小于则执行 | 3 2 !<a |
=r | 如果等于则执行 | 2 2 =a |
!=r | 如果不等于则执行 | 2 3 !=a |
状态查询
命令 | 描述 | 示例 |
---|---|---|
Z | 获取数字位数或字符串长度 | 123 Z p → 3 |
X | 获取小数位数 | 1.23 X p → 2 |
z | 获取当前堆栈深度 | 1 2 3 z p → 3 |
使用示例
-
简单计算:
dc -e "3 4 + p" # 输出7
-
进制转换:
dc -e "16o 10i 255 p" # 将255(10)转换为FF(16)
-
宏定义:
dc -e "[Hello World!]p" # 输出字符串
-
阶乘计算:
dc -e "[d1-d1<F*]dsFxp" <<< "5" # 计算5的阶乘,输出120
-
交互模式:
dc 5 3 + p # 输入后显示8
-
文件执行:
echo "3 4 * p" > calc.dc dc calc.dc # 输出12
与 bc
的关系
bc
是dc
的前端工具,提供类似C语言的语法(如3 + 4
),而dc
需用逆波兰表示法。- 示例转换:
bc
中3 + 4
→dc
中需写为3 4 + p
。
常见问题解答
Q1:如何计算 2^100 mod 101
?
2 100 101 | p # 输出 1(费马小定理)
Q2:如何设置输入基数为八进制?
8 i
Q3:如何清空堆栈?
c
Q4:为什么 dc
的输出有奇怪符号?
- 可能使用了
P
命令将数字转为二进制字符串。 - 解决:改用
p
命令或调整输出基数。