计算机 -- bc
by Jian Lee
dc
一个任意精度的命令行“逆波兰表达式(RPN)”计算器。
dc 来自现代数字计算机的主要概念-堆栈。计算机中的堆栈和厨房里的一叠盘子 没有什么不同:最后进来的最先出去(即 LIFO,亦称后入先出)。它和先入先出 (FIFO)的队列正好相反。
你只能对位于堆栈顶部的数值执行运算。两个最基本的运算是:压入(在堆栈顶 端置入)和弹出(从堆栈顶端取回)。一元运算从堆栈中弹出一个数值(“一元” 指“要求一个操作数”),二元运算从堆栈中弹出两个数值(“二元”指“要求二个操 作数”),三元运算从堆栈中弹出两个数值(“三元”指“要求三个操作数”)。每种 情况下,运算结果总是被压回堆栈的顶部。
逆波兰表达式计算器(普通手持式)在技术人员和学者中很常见。它从不要求输 入圆扩号。
历史
无扩号逻辑是由波兰数学家 Jan Lukasiewicz (1878-1956)在第二次世界大战 前发明的。起初,运算符位于操作数之前。但为便于计算机使用,运算符被置于 操作数之后,这也就是“逆波兰表达式”中“逆”字的由来。
下面练习对堆栈操作:
dc [启动任意精度逆波兰表达式计算器]
1 [将数值“1”压入堆栈]
2 [向堆栈中压入另一个数值]
3 [向堆栈中压入另一个数值]
4 [向堆栈中压入另一个数值]
f [显示整个堆栈的内容;你应该看到 1 2 3 4]
p [显示堆栈顶部的数值但不改变堆栈本身;你应该看到4]
+ [执行加法运算(二院运算),即将最上面的两个数值(4,3)弹出堆栈,然后在把运算结果(7)放入堆栈]
p [显示堆栈顶部的数值;例如,刚才加法运算的结果(7)。]
p [再次显示堆栈顶部的数值以证明堆栈的内容没有被刚才的显示操作(p)改变。]
* [执行乘法运算(二元运算);即弹出堆栈中的最后两个数值,然后将运算结果(14)放入堆栈]
p [显示刚才乘法运算的结果(14)]
P [弹出堆栈中的最后一个数值 (14)]
p [显示堆栈顶部的数值]
2000 [向堆栈中压入一个较大整数]
k [为堆栈顶部的数值(例如:2000)设置精度]
1 [向堆栈中压入另一个数值]
f [显示整个堆栈的内容]
701 [向堆栈中压入另一个数值]
/ [堆栈中的最后两个数值执行出发运算,例如:2000除以701]
p [显示最后除法运算的结果]
q [退出任意精度逆波兰表达式计算器]
请注意,逆波兰表达式从不需要扩号。可以阅读 dc 的联机帮助(man bc)了解更多功能。
bc
这是 dc 的前断。
任意精度交互式计算器。输入“quit”退出 bc。在进行浮点除法运算前输入 “scale=20”(或其他精度),否则将得到取整后的商值而不是一个浮点数。
普通计算
$ echo "2^10"|bc
1024
$ echo "2^10/2"|bc
512
$ echo "2^10/2*4"|bc
2048
$ echo "2^10/2*4-48"|bc
2000
$ echo "2^10/2*4-48+1000"|bc
3000
进制转换
ibase=X # 设置输入值的进制
obase=X # 设置输出值的进制
将十进制255转换为二进制数:
$ echo "ibase=10;obase=2;255"|bc