EMACS-DOCUMENT

=============>随便,谢谢

Emacs Calculator

你知道Emacs附带了一个计算器吗?Woop-dee-doo !电话按!哇,一个完整的计算器!

实际上,它不仅是一个简单的计算器,而是一个代数计算系统!把它名为计算器是不公平的。这太保守了,我肯定这导致了许多人忽视它。我最终是在彻底(重新)阅读Emacs手册时才遇到了它,我自己也几乎跳过了它。

几年前Will Wright在游戏 孢子 中的演示可曾见过?玩家开始是一个单细胞生物,然后进化成一个星际文明。当他开始演示时,他通过一个看起来像显微镜的东西展示了一个细胞。当时还没有人知道这个游戏是做什么的,所以每次他把范围扩大,从细菌到动物,从动物到文明,从文明到太空旅行,从行星间旅行到星系间旅行,都会引起观众的巨大反响。就像电视广告里说的:“但这还不是全部!!”

在我阅读Emacs calc手册的过程中,我不断地被它的能力所震惊,能力范围也在不断地扩大。每个新页面几乎都在说,“但这还不是全部!!”

我会像广告片一样快速过一遍它的一些功能。要查看全面的介绍请参阅calc手册。手册中有一些练习,展示了一些坑和有趣的功能交互。

按下 C-x * cM-x calc 启动Calculator。会显示两个新窗口(Emacs窗口),一个是计算器,另一个时历史记录(“跟踪”)。

首先,计算器是基于堆栈上运行的,所以它的基本用法遵循RPN。 堆栈垂直向下构建。输入数字并按回车键将其推入堆栈。操作符可以直接在数字后面输入,所以不需要一直回车。 由于负数(-)被用于减法,所以用下划线=_=表示负数。 一个包含3、4和10的堆栈示例如下所示,

3: 3
2: 4
1: 10
.

10位于堆栈的“顶部”(由“1:”表示),因此如果我们键入一个 *, 则前两个元素相乘。像这样,

2: 3
1: 40
.

The calculator has no limitations on the size of integers, so you work with large numbers without losing precision. For example, we'll take 2^200. calculator对整数的大小没有限制,因此您可以处理大数字而不会丢失精度。例如,我们取=2^200=。

2: 2
1: 200
.

应用 ^ 运算符,

1: 1606938044258990275541962092341162602522202993782792835301376
.

但这还不是全部!!它支持复数,用括号(实、虚)输入。复数可以像其他数字一样被操作。取 -1 + 2i - 4 + 2i,

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

使用 - 做减法,

1: -5
.

Then take the square root of that using Q, the square root function. 用 Q (平方根函数)然后取其平方根。

1: (0., 2.2360679775)
.

我们可以用 p 来设置精度。默认是12个位置,这里显示的时 1 / 7 的结果。

1: 0.142857142857
.

如果我们把精度调整到50,再做一次,

2: 0.142857142857
1: 0.14285714285714285714285714285714285714285714285714
.

数字也可以用各种表示法表示,比如定点表示法、科学表示法和工程表示法。不同表示法之间切换不会丢失任何信息(存储的格式与显示的格式是分开的)。

But that's not all!!! We can represent rational numbers precisely with ratios. These are entered with a :. Push on 1/7, 3/14, and 17/29, 但这还不是全部!!我们可以用比率精确地表示有理数。方法是使用 : 输入. 让我们输入 1/7, 3/14, 17/29,

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

把它们相乘,得到最终结果,

1: 51:2842
.

有一个模式让你自动完成这些运算。

但这还不是全部!!我们可以改变基数。使用 基数# 做前缀输入一个基数不同的数字。下面是我们在base-2中输入29的方法,

2#11101

我们可以用 d r 改变显示的基数。例如堆栈上有29,按基数4展示为,

1: 4#131
.

以16为基,

1: 16#1D
.

以36为基,

1: 36#T
.

但这还不是全部!!我们可以使用撇号 ' 将代数表达式输入堆栈。符号可以作为表达式的一部分以其输入。注意:RPN中无法输入这些表达式。

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

有一个“big”模式(d B),便于阅读,

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

    .

我们可以通过给变量赋值来计算表达式。如果我们将 a 赋值为10(10ssa)然后使用 "evaluates-to" 运算符(=),

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

    .

但这还不是全部!!它还支持向量类型可以用于处理向量,矩阵以及线性代数。它们用括号输入, [].

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  ] ]
    .

它支持你能想到的任何矩阵和向量运算,包括map和reduce(而且可以应用与自己定义的表达式)。

我们可以用它来解线性方程组。用 ab 的形式求出 xy 的值,

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

    .

But that's not all!!! We can create graphs if gnuplot is installed. We can give it two vectors, or an algebraic expression. This plot of sin(x) and x cos(x) was made with just a few keystrokes, 但这还不是全部!!如果安装了gnuplot,我们可以用它做图。我们可以给它两个向量,或者一个代数表达式。这张 sin(x)x cos(x) 的图只需要敲几下键就生成了,

calc-plot.png

但这还不是全部!!它还提供一个HMS类型用于处理时间和角度。2小时,30分钟,4秒,等等,

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

当然,一般操作符可以支持。我们可以把它们都加起来,

1: 7@ 55' 13"
.

我们可以在时间和弧度,角度等之间进行转换。

但这还不是全部!!计算器还有一个日期类型,输入在尖括号内, <> (在代数输入模式下)。它在输入日期时非常灵活。我们可以用 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>
.

但这还不是全部!!它还提供了一个模数形式来执行模数运算。例如,17 mod 24,

1: 17 mod 24
.

加 10,

1: 3 mod 24
.

这对 n^p mod M 这样的形式特别有用,calc可以有效地处理这种形式的运算。 例如 3^100000 mod 24. 简单的方法是先求出 3^100000,然后取模。这涉及到一个计算昂贵的中间步骤,即计算 3^100000, 这是一个巨大的数字。模块化形式则更聪明。

但这还不是全部!!计算器可以进行单位转换。我现在的Emacs版本(22.3.1)可以识别159个不同的单元。例如,我把65英里每小时推到堆栈上,

1: 65 mph
.

Convert to meters per second with u c, 输入 u c 换算成米每秒,

1: 29.0576 m / s
.

它可以灵活混合各种类型的单位。例如,我输入3立方米(' 3 m^3),

       3
1:  3 m

    .

可以换算成加仑,

1: 792.516157074 gal
   .

我在一个没有互联网的实验室工作,所以当我需要做各种转换时,Emacs是必不可少的。

光速也是一个单位。我可以输入 1 c 然后转换成米每秒,

1: 299792458 m / s
.

但这还不是全部!!就像我说的,它是一个计算机代数系统,所以它能理解符号数学。还记得之前的代数表达式吗? 我对他们进行操作。让我们把一些表达式放到堆栈上,

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

    .

现在,让我们来看最酷的功能之一:微积分。使用 a d 对x求导,

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

    .

或者撤销(U)后求积(a i),

                       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

    .

这是太棒了!一个文本编辑器能做微积分!

这就是Calc的主要特点。所有这些都让人感到繁杂,而这还只是皮毛。

自然,它还可以通过一些elisp扩展,甚至专门为此提供了一个 defmath 宏。

我打赌(希望?)有一天它会有做拉普拉斯和傅里叶变换的函数。