EMACS-DOCUMENT

=============>集思广益

emacs-calculator使用说明

你知道Emacs自带有一个计算器吗? 我的天,一个完整的计算器!听起来很不可意思,不是吗?

事实上, 这可不仅仅是个简单的计算器而已, 这是一个计算机代数系统! 虽说官方只是称呼它为一个计算器,但这只是一种谦虚的说法,我想恐怕有很多人因此而忽视了它. 我自己也是在通读Emacs manual时才发现它的,而且当时也差点略过了它.

你有看过几年前Will Wright为孢子游戏所做的展示么? 玩家一开始只是个单细胞生物,后来发展出一个横跨星际的文明. Will Wright开始时只展示了一个显微镜下的细胞. 没人知道这个什么样的游戏,而随着尺度的增加,从细菌到动物,从动物到出现文明,从出现文件到实现太空旅行,在星际间旅行到星系间旅行,引起了观众一次次的强烈反响. 就像它的广告语说的:"还没完呢!!!"

随着我不断的深入Emacs calc manual,我一次次的感叹于它的功能之强. 每一页说明都在告诉我:"还没完呢!!!".

我这里仅仅对对其某些特征进行讲解. 要想获得一个全面的了解,你需要阅读calc manual. manual中甚至还有一些练习来展示一些陷阱和一些有趣的特征交互.

按下 C-x * cM-x calc 启动calc. 会显示出两个新窗口(Emacs意义下的窗口),一个是计算器,另一个显示操作历史.

首先,这个计算器是基于栈操作的,它的基础用法是采用逆波兰表示法. 栈垂直向下生长. 输入数字然后回车就会将数字入栈. 输入数字后也可以直接输入运算符而无需每次都回车. 由于减号(-)被用于表示减法运算符,因此使用下划线(_)来表示负数. 下面是一个例子,依次入栈3, 4, 10:

3:  3
2:  4
1:  10
    .

10位于栈顶(因此它的前面的编号为"1:"), 当我们输入 * 时,最顶部的两个元素会相乘:

2:  3
1:  40
    .

calc支持无限长度的整型,因此你可以使用超大的数而不会有精度丢失. 例如我们计算一下2^200:

2:  2
1:  200
    .

按下 ^,

1:  1606938044258990275541962092341162602522202993782792835301376
    .

还没完!!! Calc支持复数,方法是将实部与虚部成对放入括号内,像这样 (real, imaginary). 可以对复数进行任意运算,就跟其他数一样. 例如计算 -1 + 2i 减去 4 + 2i,

2:  (-1, 2)
1:  (4, 2)
    .

按下 - 作减法,

1:  -5
    .

然后按下 Q 调用平方根函数计算平方根.

1:  (0., 2.2360679775)
    .

你还可以按下 p 来设置计算的精度. 默认精度为12位. 例如计算 1 / 7:

1:  0.142857142857
    .

我们将精度调整为50位后,再计算一次:

2:  0.142857142857
1:  0.14285714285714285714285714285714285714285714285714
    .

数字能以各种计数法的方式来表示,例如定点计数法,科学计数法,工程计数法. 可以在不同计数法之间切换而不会丢失任何信息(数的存储与显示是独立的).

还没完呢!!! 我们还可以用分数的形式表示有理数. 格式是 分子:分母.

3:  1:7
2:  3:13
1:  17:29
    .

它们的累积以最低层的形式来显示(And multiply them all together, which displays in the lowest form),

1:  51:2842
    .

There is a mode for working in these automatically.

还没完呢!!! 我们还能修改基数. 要输入一个其他基数的数字,只需要以基数和 # 为前缀即可. 例如我们是这样输入以2为积的29的:

2#11101

可以通过 d r 修改显示的基数. 例如假设栈中的数字为29(10进制),则转换成以4为基数则是:

1:  4#131
    .

转换为16进制为:

1:  16#1D
    .

转换为36进制为:

1:  36#T
    .

还没完呢!!! 我们也可以直接输入代数表达式,方法是以单引号(')开头. 表达式中甚至还可以带符号. 注意: 这些表达式不是以逆波兰表示法录入的.

1:  a^3 + a^2 b / c d - a / b
    .

按下 d B 可以进入"big"模式,在此模式下更易阅读:

            2
     3   b a    a
1:  a  + ---- - -
         c d    b


    .

我们还可以为变量赋值来计算表达式. 例如使用 "evaluates-to" 运算符将a的值赋为10可以得到下列结果:

          2
     3   a  b   a             100 b   10
1:  a  + ---- - -  =>  1000 + ----- - --
         c d    b              c d    b

    .

还没完呢!!! Calc支持向量类型,可以用来表示向量,矩阵并进行线性代数运算. 方法是将各元素置入方括号内,[]

2:  [4, 1, 5]
1:  [ [ 1, 2, 3 ]
      [ 4, 5, 6 ]
      [ 6, 7, 8 ] ]
    .

然后计算该向量与矩阵的点积与叉积.

2:  [38, 48, 58]
1:  [ [ -14, -18, -22 ]
      [ -19, -18, -17 ]
      [ 15,  18,  21  ] ]
    .

Calc支持你能想到的任何矩阵与数组运算,包括map和reduce(而且你还能定义自己的应用表达式)

可以用Calc来求解线性方程. 基于a和b算出x和y的值.

x + a y = 6
x + b y = 10

我们这么输入它(注意我们我们这里用了符号),

2:  [6, 10]
1:  [ [ 1, a ]
      [ 1, b ] ]
    .

按下除法运算符

          4 a     4
1:  [6 + -----, -----]
         a - b  b - a

    .

还没完呢!!! 若安装了gnuplot的话,还能用Calc创建图形. We can give it two vectors, or an algebraic expression. 只需要很少的几次按键,都能画出下面的 sin(x)x cos(x) 的图形来.

calc-plot.png

还没完呢!!! Calc还支持一种叫做HMS的类型,该类型可以表示时间和角度. 例如可以表示像2小时30分4秒这类东西.

3:  2@ 30' 4"
2:  4@ 22' 13"
1:  1@ 2' 56"
    .

当然我们可以对其进行常见的计算. 让我们将这些时间都雷加起来:

1:  7@ 55' 13"
    .

我们可以将之与弧和度进行相互转换.

还没完呢!!! Calc本身也有时间类型,方法是将时间填入尖括号内,<>(需在代数模式下输入). 要输入时间真的很灵活. 若像输入当前时间,只需按下 t N 即可.

1:  <6:59:34pm Tue Jun 23, 2009>
    .

这时,输入的数字会作为天来看待,例如加4的结果是:

1:  <6:59:34pm Sat Jun 27, 2009>
    .

它还支持与前面说的HMS格式的值进行计算,例如减去 2@ 3' 15"的结果为:

1:  <4:56:32pm Sat Jun 27, 2009>
    .

还没完呢!!! Calc还有一种模形式用于进行求模运算. 例如,输入 17 mod 24,

1:  17 mod 24
    .

加上10,得到结果为

1:  3 mod 24
    .

模形式对于要计算 n^p mode M 这种形式的运算时,特别方便. 例如,要计算 3^100000 mod 24,一般的方法时先计算 3^100000,再取模. 由于 3^100000 是一个很大的数,因此计算这个中间步骤十分昂贵. 使用模形式能够不必实际地计算出 3^100000 的值来.

还没完呢!!! Calc还能进行单位转换. 我这会儿用的Emacs版本(22.3.1)支持159种不同的格式. 例如,我输入65mph.

1:  65 mph
    .

按下 u c 将其单位转换为 米每秒(m/s)

1:  29.0576 m / s
    .

Calc还支持不同单位进行混用. 例如我输入3立方米:

       3
1:  3 m

    .

可以转换成加仑:

1:  792.516157074 gal
    .

我所在的实验室白天的时候连接不上互联网, 因此当我需要做各种转换时,Emacs是不可缺少的.

光速也是一种单位,我可以将 1c 转换为米每秒:

1:  299792458 m / s
    .

还没完呢!!! 就像我说过的, Calc实现了一个计算机代数系统, 因此它能够进行符号运算. 还记得之前的那些代数表达式么? 我可以对它们进行运算. 让我们先输入一些表达式.

3:  ln(x)

       2   a x
2:  a x  + --- + c
            b

1:  y + c

    .

将最顶上两个表达式想乘,然后加上第三个表达式得到答案:

                2   a x
1:  ln(x) + (a x  + --- + c) (y + c)
                     b

    .

按下 a x 对表达式进行扩展,然后按下 a s 简化表达式:

                 2   a x y              2   a c x    2
1:  ln(x) + a y x  + ----- + c y + a c x  + ----- + c
                       b                      b

    .

下面介绍Calc其中最酷的一项功能:微积分. 按下 a d 可以对x求微分:

    1             a y             a c
1:  - + 2 a y x + --- + 2 a c x + ---
    x              b               b

    .

Or undo that and integrate it,

                       3      2                  3        2
                  a y x    a x  y           a c x    a c x       2
1:  x ln(x) - x + ------ + ------ + c x y + ------ + ------ + x c
                    3       2 b               3       2 b

    .

太牛逼了! 一个文本编辑器居然可以做微积分!

目前为止, 我已经介绍了大多数的常用功能. 要想说完所有的功能太累人了,我只是讲了点皮毛而已.

很自然的, 我们也可以用elisp来扩展Calc. Calc还提供了一个宏 defmath 以方便我们进行扩展.

我希望有一天,Calc能够进行拉普拉斯和傅里叶变换.