Go to the first, previous, next, last section, table of contents.


代数形式の計算(Algebraic-Style Calculations)

もしあなたが RPN(逆ポーランド)記法に慣れていないなら、非RPN の電卓に似た 動作の「代数モード」で操作する方が向いているかもしれません。代数モードで は、伝統的な 2+3 表記法で数式を入力します。

非代数モードでの代数的入力

実を言うと、代数式を入力するには特別な「モード」を必要としません。 アポストロフィー・キー(') を押すことによって、 いつでも数式を入力することができます。 プロンプトに答えて望む数式を入力し、それから RET を押してください。 数式は演算評価され、結果は RPN スタックに push されます。 もし RPN で考えることを全く望まないなら、計算全体を数式として入力して、 スタックから結果を読み、 それから DEL を押してスタックからそれを削除することができます。

アポストロフィー・キー、そして 2+3+4、そして RET を押してみ てください。結果は数値の9になるはずです。

代数式は演算子 `+', `-', `*', `/', および `^' を使います。演算評価の順序を明確にするためにカッコを使うことができます。 カッコが無ければ `^' が最初に評価され、次に `*'、そして `/'、最後に `+'`-' の順で評価されます。例えば、式

2 + 3*4*5 / 6*7^8 - 9       は

2 + ((3*4*5) / (6*(7^8)) - 9   と同等です。

また、大型表記での次式も同等です。

    3 * 4 * 5
2 + --------- - 9
          8
     6 * 7

この式の結果は数値 -6.99999826533 となります。

Calc の評価順序はたいていのコンピューター言語と同じですが、唯一の相違は上 の例のように、`*'`/'よりも強く結びつきます。

訳注:サラリと書かれているが、違いが判っただろうか ? 通常のコンピューター言語や Exel などでは、上の式をカッコを使わず入力するとき `2 + 3*4*5 / 6*7^8 - 9' ではなく `2 + 3*4*5 / 6/7^8 - 9' と書かねば正しい結果が得られない。 Calc ではどちらで書いても同じ結果である。 文字式の場合も `a / b / c' は Calc の書替規則によって `a / b c' と書き直されるが、この表記はそのままでは他言語には使えない。 d C と打って C 言語表記モードに変えると C 言語用に書き直されて、 `a / (b*c)' となる。

標準的な数学表記のように `*' 記号は省略可能で、`2 a'`2*a' と同等です。

同レベルの演算子は左から右に評価されますが、`^'だけは右から左に評価 されます。したがって `2-3-4'`(2-3)-4'-5 と同等であ るのに対し、`2^3^4'`2^(3^4)' と同じになります (大変大きな数です; 試してください)。

代数モード

いつもいつもアポストロフィーを押すのがおっくうなら、代数表現が入力されつ つあることを Calc が自動検知する「代数モード」を選ぶことができます。このモー ドに入るには、2文字 m a と打ちます。(`Alg' という表示がCalc ウィンドウのモードラインに現れるはずです。)

m aと打って、次にアポストロフィー無しに2+3+4と打ち、そして RETを押してください。

代数モードでは、数値入力を始めるキー(数字, 小数点, _(マイナス符号)) や ([ が押されると、Calc は自動的に代数的入力方式になります。

`+'`*' のような演算子記号を持っていない関数は、 ファンクション・コール表記を使って式に書かねばなりません。 例えば、平方根キー Q に対応している関数名は sqrt です。 数式で平方根を計算するには、 `sqrt(x)'という表記を使います。

アポストロフィーを押して、 それから sqrt(5*2) - 3 とタイプしてください。 結果は 0.16227766017 になるはずです。

式が関数名から始まるなら、 たとえ代数モードであっても アポストロフィーを使う必要があることに注意してください。 もしいきなり arcsin とタイプしたら、 a r は代数の書換えコマンドであると解釈され、 そして csin は使うべき書直し規則の名前であると解釈されるでしょう!

普段は Calc を RPN 電卓として使っていても、 複素数やベクトルを入力するのに代数形式を好む人がいます。 というのは、逆ポーランド方式で不完全項を入力するのはとても煩雑だからです。

まだ代数モードで、タイプしてください:

1:  (2, 3)     2:  (2, 3)     1:  (8, -1)    2:  (8, -1)    1:  (9, -1)
    .          1:  (1, -2)        .          1:  1              .
                   .                             .

 (2,3) RET      (1,-2) RET        *              1 RET          +

代数モードは、最初にアポストロフィーを押さずに複素数を入力することを許し ますが、それは同時に1のような単純な数ですら、全ての入力項の後に RETを押す必要があることを意味します。

(C-u m a とタイプして特別な「制限代数モード」にすることもできます。 このモードでは、( キーと [ キーで代数的入力が開始し、普通の 数値キーでは 逆ポーランド入力です。 同じく、m t で起動される「完全代数モード」があり、 このモードでは全ての標準キーで代数的入力を開始します。 この場合、Calc コマンドを打つのに META キーを使わねばなりません: 例えば完全代数モードを抜けるのに M-m t、 Calc を終了するのに M-q、などなど。 完全代数モードは Emacs 19 ではサポートされません。)
(訳注: Emacs 20 以降でもサポートされていない。)

まだ代数モードにいるなら、再度 m a と打つと抜けられます。

現実の非 RPN 電卓は代数方式と RPN 方式をごっちゃにして使っています。 一般の電卓では、 (+* のような) 2つの数の演算子は代数形式で入力し、 (nQ のような) 1つの数の演算子は逆ポーランド的に入力します。 また、非 RPN 電卓は入力の進行につれて計算の中間結果を表示します。 Calc でこれを実現するには、計算をいくつかの代数式の一連として実施し、 これらを $ 記号で関連付けます。 代数式の中で、$ はスタック top の値を表します。ここで、 sqrt(2*4+1) の計算をやってみましょう。 伝統的な電卓においてこの計算は、2 * 4 + 1 = と押してから 平方根キーを押して実行されます。

1:  8          1:  9          1:  3
    .              .              .

  ' 2*4 RET        $+1 RET        Q

$+1 の前にアポストロフィーを打つ必要が無かったことに注目してくださ い。$ 記号は常に代数的入力を開始させるからです。

(*) 練習問題 1. RPN入力で Q を押すのと同じ事を代数的入力で実行するにはどうしますか? もし Q キーが壊れたら? 代数形式入力 練習問題 1 解答「Q コマンドの代替」 参照 . (*)

表記 $$, $$$, ・・・は、さらに上位のスタック内容を参照します。 例えば、' $$+$ RET は単に + を打つのと同じ事です。

変数

代数式は変数(variables)を含むことができます。変数に値をストアするに は、s s, 変数名, RET の順に打ちます。(ストアコマンドは実は2種 類あって、s s は数値をスタックに残したまま変数にストアし、一方 s t はスタックから数値を除去して変数にストアします。) 変数名は文 字で始り、1文字以上の文字または数字で構成されなければなりません。

1:  17             .          1:  a + a^2    1:  306
    .                             .              .

    17          s t a RET      ' a+a^2 RET       =

= キーは、式中の変数をそれぞれにストアされた値に置換える事によって、 式を評価(evaluate)します。

RPN演算で変数値をスタックに呼び出すには、変数名を代数式入力した後 = を押すか、または s r コマンドを使います。

1:  17         2:  17         3:  17         2:  17         1:  306
    .          1:  17         2:  17         1:  289            .
                   .          1:  2              .
                                  .

  s r a RET     ' a RET =         2              ^              +

もし変数名として1桁の数字を(s t 3 のように)使ったら、 10個のクイック変数(quick variables) q0q9 のうちひとつを使うことになります。 qRET を打たずにすむので「クイック」です。 実際、s s 3 の短縮形として s 3が使えるし、 同様に t 3, r 3 なども使えます。

未定義変数, 未定義関数の扱い

代数式を評価しても、値がストアされていない変数は残されます。

1:  2 a + 2 b     1:  34 + 2 b
    .                 .

 ' 2a+2b RET          =

未定義変数と同様に、定義されていない関数呼び出しも残されます。

1:  2 + log10(0) + log10(x) + log10(5, 6) + foo(3)
    .

 ' log10(100) + log10(0) + log10(x) + log10(5,6) + foo(3) RET

この例で、最初の log10 呼出しは機能しましたが他は動きませんでした。 2番目の呼出しで、この引数値でのロガリズムは定義されません。3番目では引数 が記号ですし、4番目は引数が多すぎます。5番目では foo という関数は 存在しません。「Wrong number of arguments(引数の数がおかしい)」というメッ セージが `log10(5,6)' に対して表示されます。w ("why")を押し て、先ほどの計算で他に発生したかもしれないメッセージを見てみましょう。今 回の場合は「logarithm of zero(ゼロの対数)」、そして「number expected(数 値を期待する): x」が出ます。Calcは最初のメッセージが重大な場合に 限りそれを自動的に表示します。たとえば、Calcは「Wrong number of argument」 と「logarithm of zero」を自動レポートするに足る重大事と考えますが、一方 「number expected: x」のようなメッセージは明示的に w キーを 押した場合に限って表示されます。

(*) 練習問題 2. ジョーは式 `2 x y' を入力し、x に5をストアしてから = を押して、予想した結果 `10 y' を得ました。次に彼は、式 `2 x (1+y)' について同じ事を行い `10 (1+y)' という結果を予想しましたが、 そうなりませんでした。なぜでしょう? 代数形式入力 練習問題 2 解答「ジョーの苦悩(代数編)」 参照 . (*)

(*) 練習問題 3. 1 RET 0 / と打つとどうなると思いますか? さらに続けて 0 * と打つと? 代数形式入力 練習問題 3 解答「1 / 0」 参照 . (*)

evaluates-to 演算子

変数を扱う面白い方法はevaluates-to (`=>') 演算子を使うことで、 それはこのように働きます。いつもの方法で式を代数的に入力しますが、式の後 ろに `=>' 記号を付けて下さい。(s = というコマンドもあって、ス タックを用いて `=>' 式を作ります。) スタックには、 `=>' をはさ んで両側に2つの式が現れるでしょう。左辺の式は入力した式そのもので、右辺 の式は(= を打ったのと同様に)評価済みのものです。

2:  2 + 3 => 5                     2:  2 + 3 => 5
1:  2 a + 2 b => 34 + 2 b          1:  2 a + 2 b => 20 + 2 b
    .                                  .

' 2+3 => RET  ' 2a+2b RET s =          10 s t a RET

このとき a に新しい値をストアしたことに注意してください。すでにス タックにある、a を参照する全ての `=>' 演算子が新しい値を使う ように更新されます。`=>'を使えば、式の集合をスタックにPUSHしておいて、 変数の値を実験的に変化させ、それぞれの式への影響を観察できます。

使い終わったら、変数を「アンストア」することもできます。

2:  2 + 5 => 5
1:  2 a + 2 b => 2 a + 2 b
    .

    s u a RET

次に Calc の代数学と微積分機能を論じるとき、我々は再び変数と関数を伴う式 に出会うでしょう。


Go to the first, previous, next, last section, table of contents.     利用度数