dc
===

任意精度计算器

## 说明

dc 是一款逆波兰表达式计算器，支持无限制精度的算术运算。它还允许您定义和调用宏。通常，dc从标准输入读取，也可以通过参数传入文件来求值。

## 语法

```shell
dc [选项] [文件...]
```

### 选项 

```shell
-e, --expression=EXPR    # 评估表达式
-f, --file=FILE          # 评估文件内容
-h, --help               # 显示此帮助并退出
-V, --version            # 输出版本信息并退出
```

```shell
p 打印堆栈顶部的值并以换行符结束语句。
n 打印堆栈顶部的值并以空语句结束行。
f 打印整个堆栈，不做任何更改。
P 从栈顶弹出值。
c 清除堆栈。
d 复制顶部值并将其推入主堆栈。
r 反转堆栈中顶部两个元素的顺序。
Z 从堆栈中弹出值，计算其中的位数并压入该数字。
X 从堆栈中弹出值，计算其中的小数位数并压入该数字。
z 将堆栈长度推入堆栈。
i 从堆栈中弹出值并将其用作输入基数。
o 从堆栈中弹出值并将其用作输出基数。
k 从堆栈中弹出值并使用它来设置精度。
I 将输入基数的值推入堆栈。
O 将输出基数的值压入堆栈
K 将精度值压入堆栈。
```

## 示例

下面是 `dc` 命令在命令行完成的计算 `10 * 10` 得出结果 `100`，并推出的过程

```shell
$ dc        

10          # 1. 输入数字10
10          # 2. 输入数字10
*           # 3. 输入运算类型*表示乘
p           # 4. 输入p得到计算结果
100
q           # 5. 输入 q 退出 dc
```

示例显示在命令行结果 `509`

```bash
$ dc --expression="50 10 * 9 + p"
509
```

## 支持的运算

`+` 从堆栈中弹出两个值，将它们相加，然后压栈结果。

`-` 弹出两个值，从弹出的第二个值中减去弹出的第一个值，并压栈结果。

`*` 弹出两个值，将它们相乘，然后压栈结果。结果中分数位数取决于当前精度值和两个参数中的分数位数。

`/` 弹出两个值，将弹出的第二个值与弹出的第一个值相除，然后推送结果。分数位数由精度值指定。

`%` 弹出两个值，计算/命令将执行的除法的剩余部分，并推送该值。计算的值与序列 `Sd dld/Ld*- `计算的值相同。

`~` 弹出两个值，将弹出的第二个值与弹出的第一个值相除。首先推送商，然后推送余数。除法中使用的小数位数由精度值指定。

（序列 SdSn lnld/lnld% 也可以完成此功能，但错误检查略有不同。）


`^` 使用弹出的第一个值作为指数，第二个值作为基数，弹出两个值并进行幂运算。忽略指数的分数部分。

`|` 弹出三个值并计算模幂。 弹出的第一个值用作约简模数； 这个值必须是一个非零数字，并且应该是一个整数。 弹出的第二个用作指数； 该值必须是非负数，并且该指数的任何小数部分都将被忽略。 弹出的第三个值是取幂的基数，它应该是一个整数。 对于小整数，这类似于序列 Sm^Lm%，但与 ^ 不同的是，此命令适用于任意大的指数。

`v` 弹出一个值，计算其平方根，然后压栈它。精度值的最大值和参数的精度用于确定结果中的小数位数。
