Emacs下的计算器 - calc
作者: yupeng
1 概述
“Calc” 是 emacs 自带的一个计算器,提供了许多方便的数值计算功能,可以让你在不离开 emacs 的情况下进行计算。但 calc 与 gnome 环境下的 gcalctool 或者 windows 自带的计算器不同,它不是一个掌上计算器的模拟程序,操作不像上述两个计算器那样直观,需要记忆一些指令,相应的,提供的功能也更加强大了一些。
2 打开计算器
‘C-x * c’:打开计算器。
‘C-x * t’:打开计算器,同时也打开 calc 的在线帮助。
3 基本运算
3.1 逆波兰表达式
calc 按照逆波兰表达式的方式进行计算。比如,你要计算2+3的结果,要按照如下顺序在 calc 的 buffer 中输入:
2 <RET> 3 <RET> + (<RET> 表示回车)
假设,你当前输入了:
1 <RET> 2 <RET> 3 <RET>
然后,输入加号 ‘+’,那么 calc 将会计算 2+3 的结果, 并保持数字1不变,calc 的 buffer 中会剩下 1,5两个数字。此时,再次输入’+', calc 会计算 1+5 的结果,此时 calc 的 buffer 中只剩下一个数字 ‘6’。
很多时候,可以省略一个<RET>,比如计算2+3时,你可以省略第二个<RET>,只输入:
2 <RET> 3 +
3.2 基本运算符号
‘+’:加号
‘-’:减号
‘*’:乘号
‘/’:除号
‘%’:取余,比如6%5=1, 30%4=2
‘&’:取倒数
‘^’:幂运算,当然也可以用做开方运算,比如4^0.5=2
3.3 代数运算
当我们只是想简单的对一系列数字进行代数运算时,使用逆波兰表达式不是很直观,因此, calc 提供了一个更加直接的指令:
‘ (就是分号旁边的那个按键)
比如,在 calc 中按“’”,然后输入算式:
(3^2 + 4^2) ^ 0.5
calc 会直接给出答案:5。
4 数制转换
在 calc 中使用指令d2,d8,d0,d6可以在2进制,8进制,10进制,16进制之间切换(d2 就是先按’d',再按’2′,其他也以此类推)。calc 默认是使用10进制进行计算。当进入2进制,8进制,16进制模式时,mode line上会给出’Bin’,’Otc’,’Hex’字样的提示,默认的10进制模式是不会有任何提示的。当进入任何一种进制模式的时候,输入的数字都是以10进制模式输入的。比如在16进制模式下,输入:
10 <RET>
此时,calc中显示的数字是’A',而不是16进制的10。
如果你想按照当前的进制输入数字,需要在键入数字前按‘#’,比如,在16进制模式下输入:
#10 <RET>
此时,calc中显示的数字就是16进制的10,而不是A。
5 三角运算
5.1 逆波兰表达式下的运算符
S:正弦
C:余弦
T:正切
比如,想计算30度角的正弦值,输入:
30 <RET> S(可以省略 <RET>)
calc 会给出答案:0.5
5.2 在代数模式下的运算符
sin:正弦
cos:余弦
tan:正切
比如,输入
’sin(30)2+cos(30)2
我这里的calc给出答案:
0.999999999999
5.3 弧度制和角度制的转换
m r:进入弧度制(mode line 上显示 Rad)
m d:进入角度制(mode line 上显示 Deg)
6 向量运算与矩阵运算
输入向量与矩阵的方法很简单。
比如,输入一个三维向量:
[ 1 <RET> 2 <RET> 3 <RET> ]
此时,calc 中就会显示:
[1, 2, 3]
(实际上最后一个<RET>可以省略)
输入矩阵的方法与向量类似,比如,我们输入一个2×2的矩阵:
[ [ 1 <RET> 2 <RET> ] [ 3 <RET> 4 <RET> ] ]
此时, calc 中会显示:
[ [ 1, 2 ]
[ 3, 4 ] ]
calc中专门的矩阵运算法则我没有研究过,我自己平常会用到的,也就是矩阵求逆。只需输入一个矩阵,然后按“&”就可以了(还记得“&”么?如果对数字使用“&”运算,就是求倒数,对于矩阵,就是求逆)。
7 复制,删除,撤销
输入一个数字(或矩阵),然后按<RET>,可以复制该数字(或矩阵)到整个运算堆栈的最顶部。
Backspace 或 Del 可以删除运算堆栈最顶部的数字(或矩阵)。
用U或者C-_或者M-x calc-undo可以在计算器中执行撤销操作
8 定义函数
在 calc 中你可以定义自己的函数。定义函数的指令是:
Z F
比如,先输入一个公式:
‘a + 2b
然后键入:
Z F m
再回答几个 minibuffer 中提出的问题,就定义了一个以 ‘z m’为快捷键的函数了。
此时,再输入两个数字:
1 <RET> 2 <RET>
然后按:
z m
就会按照公式计算出1+2*2的结果,也就是5。
使用指令:
Z P
可以把函数保存到文件,这样在以后的 emacs 会话中都可以使用这个函数。
比如,输入:
Z P m
可以把刚才定义的函数’z m’保存到由变量 calc-settings-file 指定的文件中。以后每次进入 calc 时,保存在这只文件中的函数也会被自动加载。calc-settings-file 的默认值是”~/.calc.el”,我通常喜欢把它挪到.emacs.d 里面:
(setq calc-settings-file "~/.emacs.d/.calc.el") |

loading...
真是好学啊,这些功能很多都还没用过。
[回复]
ahei 回复:
五月 5th, 2010 at 5:32 上午
@seagle0128, 呵呵,那就赶快用,还是非常好用的。
[回复]
filebat 回复:
五月 6th, 2010 at 10:18 上午
@ahei,
ahei,我感觉一般用calc也就四则运算。
还有啥经常需要应用的场景吗?
[回复]
ahei 回复:
五月 6th, 2010 at 10:35 上午
@filebat, 看每个人了,我一般也就这些需求
[回复]
我也是主要用四则运算,通常都是 ‘ 加算式。
再有就是10进制和16进制的转换,有时还定义些函数,比如由寄存器的值算出串口波特率之类的。
极其少见的,在做rgb到ycc之类的图像公式转换的时候用过矩阵求逆。
ps:我是作者。
[回复]
ahei 回复:
五月 6th, 2010 at 2:51 下午
@yupeng, 呵呵, 我更喜欢用C-x * q, 方便. 今天本来想找下那个函数直接计算表达式的值来着, 找了半天没找到, quick-calc还挺复杂
[回复]
这不就整个一dc嘛。
[回复]