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


算術実習(Arithmetic Tutorial)

本節では、Calc で利用できる算術関数や科学関数を探検します。

算術関数

標準の算術コマンド群は +, -, *, /, ^ です。 どれも、普通2個の数値をスタック top から取り、結果を push して返します。 n キーと & キーはそれぞれサインチェンジと逆数操作を行います。

1:  5          1:  0.2        1:  5.         1:  -5.        1:  5.
    .              .              .              .              .

    5              &              &              n              n

+ のような「二項演算子」は、 接頭引数を与える事でスタックの何項分でも一度に作用することができます。 また、マイナスの接頭引数を与えれば、top の要素一つと いくつかの項をそれぞれペアリングさせて作用することもできます。

3:  2          1:  9          3:  2          4:  2          3:  12
2:  3              .          2:  3          3:  3          2:  13
1:  4                         1:  4          2:  4          1:  14
    .                             .          1:  10             .
                                                 .

2 RET 3 RET 4     M-3 +           U              10          M-- M-3 +

& のような「単項演算子」は、接頭引数により top の n 項に 効かせることができます。

3:  2          3:  0.5                3:  0.5
2:  3          2:  0.333333333333     2:  3.
1:  4          1:  0.25               1:  4.
    .              .                      .

2 RET 3 RET 4      M-3 &                  M-2 &

結果が浮動小数点書式のままになった事に注目ください。 「floor(底)」関数である F を押して、それらを整数に変換することができます。 この関数は小数部を切下げて、すぐ下の整数にします。 R というのもあって、もっとも近い整数に丸めます(四捨五入)。

7:  2.         7:  2          7:  2
6:  2.4        6:  2          6:  2
5:  2.5        5:  2          5:  3
4:  2.6        4:  2          4:  3
3:  -2.        3:  -2         3:  -2
2:  -2.4       2:  -3         2:  -2
1:  -2.6       1:  -3         1:  -3
    .              .              .

                  M-7 F        U M-7 R

除算して底を取る操作(すなわち「整数商」)はありふれた操作なので、 Calc はこの目的に特別なコマンド \ (バックスラッシュ)を用意しています。
(訳注: 日本語キーボードによっては (円マーク)キーが対応する。)
もうひとつ同系の算術演算子は % であって、 \ 演算の際にできる「余り」(すなわち2数の「剰余」)を計算します。

2:  1234       1:  12         2:  1234       1:  34
1:  100            .          1:  100            .
    .                             .

1234 RET 100       \              U              %

これらのコマンドは、実は整数に限らずどんな実数にも働きます。

2:  3.1415     1:  3          2:  3.1415     1:  0.1415
1:  1              .          1:  1              .
    .                             .

3.1415 RET 1       \              U              %

(*) 練習問題 1. / F でいつでも同じ事ができるのだから、 \ コマンドは余計なものに思えるかもしれません。 この反例---/ F が同じ結果をもたらさない状況---を考えてみましょう。 その状況で、もし Calc に \ コマンドがなかったら、 あなたならどうやって問題を切抜けますか ? 算術 練習問題 1 解答「なぜ \ コマンドか?」 参照 . (*)

科学関数

私達は既に、Q (平方根)と S (サイン)コマンドを見ました。 これと同一線上のコマンド群は、C (コサイン), T (タンジェント), E (e^x), L (自然対数)です。これらのコマンド群は、 I (インバース) や H (ハイパボリック)プリフィックス・キーで 修飾することができます。

ある角度のサインとコサインを計算して、恒等式 sin(x)^2 + cos(x)^2 = 1 を実証しましょう。 x として、ここでは任意に -64 を選びましょう。 角度モードを degree に設定して(m d と打つ)、実行してください。

2:  -64        2:  -64        2:  -0.89879   2:  -0.89879   1:  1.
1:  -64        1:  -0.89879   1:  -64        1:  0.43837        .
    .              .              .              .

 64 n RET RET      S              TAB            C              f h

(簡単のため、ここでは結果を5桁の有効数字でお見せしています。 あなたはもちろんお好みの精度でこの計算を実行できます。)

f hcalc-hypot であって、 2乗和の平方根を出すコマンドであることを思い出してください。

もう一つの恒等式は、 tan(x) = sin(x) / cos(x) です。

2:  -0.89879   1:  -2.0503    1:  -64.
1:  0.43837        .              .
    .

    U              /              I T

この計算の物理的解釈は、原点から右に 0.43837 単位、 下に 0.89879 単位移動した時、 動きの方向は水平線から -64°であるということです。 反対の向き、つまり左上に移動した場合を考えてみましょう。

2:  -0.89879   2:  0.89879    1:  -2.0503    1:  -64.
1:  0.43837    1:  -0.43837       .              .
    .              .

    U U            M-2 n          /              I T

どうして同じ角度なのでしょう ? その答は、/ 演算で入力の符号情報が失われるということです。 除算の結果が負なので、入力のどちらかが負であった事は確かですが、 どちらが負なのかは判りません。 ここに、一対の数値の商のアークタンジェントを計算する f T [arctan2] 関数があります。 関数にはオリジナルの2値を与えるので、 全方位360°の答を出すのに充分な情報があります。

2:  0.89879    1:  116.       3:  116.       2:  116.       1:  180.
1:  -0.43837       .          2:  -0.89879   1:  -64.           .
    .                         1:  0.43837        .
                                  .

    U U            f T         M-RET M-2 n       f T            -

予想通り、角度の計算結果は互いに180°異なります。 つまり、互いに反対方向を指しています。

例題の第3ステップで使った META-RET は、 「最後の引数(群)」コマンドです。これは一種の Undo のようなものですが、 最後に実行したコマンドの結果を削除せずに、 そのコマンドの引数(群)をスタックに返します。 今回のように、同じ入力に対していくつかの演算をしなければならない場合に便利です。 U U の直後に M-2 RET でスタック top の2要素を複製し、 それから M-TAB を2回使って 116 を循環させ複製の上に逃がしても、 同じ事になったでしょう。

双曲線関数のハイパボリックサイン, ハイパボリックコサインにも同様な恒等式が 成立ちます。 三角関数との違いは、和ではなく差 であることで、 cosh(x)^2 - sinh(x)^2 = 1 が常に成立します。 ではこの恒等式を実証してみましょう。

2:  -64        2:  -64        2:  -64        2:  9.7192e54  2:  9.7192e54
1:  -64        1:  -3.1175e27 1:  9.7192e54  1:  -64        1:  9.7192e54
    .              .              .              .              .

 64 n RET RET      H C            2 ^            TAB            H S 2 ^

両者を引算すると結果はゼロになってしまう! ということは、何かが明らかに間違っています。 しかし考えてみてください。 両者の差分が1だとしたら、それは小数点以下第55桁目に存在するのです。 探していた差分は丸め誤差の中に完全に埋没してしまったのです。

たとえば60桁の精度で実際に計算していれば、この仮説を確めることができた でしょう。この計算には時間がかかりますが、途方も無く・・・というわけで もないでしょう。やりたければやってみましょう。 答は 0.99999 のはずで、充分合理的に1に近いといえるでしょう。
(訳注: 55桁目にあるはずの1を、60桁の精度で計算したのでこうなる。)

もちろん、`x'にまともな値を入れるのがまともな実証方法です!

ハイパボリック・プリフィックスは、いくつかの計算コマンドで他の目的に使われます。 例えばログととエクスポネンシャルは通常 e を底として使いますが、 ハイパボリック・プリフィックスで修飾すると替りに 10 を底として使います。

1:  1000       1:  6.9077     1:  1000       1:  3
    .              .              .              .

    1000           L              U              H L

最初に、間違えて自然対数を計算しました。 それで、undo してから常用対数を計算しました。

B キーは、任意の値 b を底として一般対数を計算します。

2:  1000       1:  3          1:  1000.      2:  1000.      1:  6.9077
1:  10             .              .          1:  2.71828        .
    .                                            .

 1000 RET 10       B              H E            H P            B

ここでは、まず B を使って 10 を底とする対数を計算し、 次に「ハイパボリック・エクスポネンシャル」(訳注: 10^x)を近道に使って 数値 1000 に戻しました。 そして、 B をもう一度使って自然対数を計算しました。 ところでハイパボリックプリフィックスで修飾された P は、 定数 e をスタックに push します。
(訳注: 単なる P は定数πを push する。)

お気づきかもしれませんが、1000 の常用対数を取ったとき、厳密な整数値 3 を 得ています。Calc は常に、有理数の計算には有理数の結果が厳密に求まるように、 可能な限り努力します。。ところが H E を使ったときには、 明白な理由もなく浮動小数点の数値を返しました。 実際、もし 10 RET 3 ^ を計算していたら、 厳密な整数値 1000 が得られたのに・・・。 しかし H E コマンドは何時でも浮動小数点の数を発生するようにできていて、 1000 H E が 1000 桁もの整数を計算して時間を浪費しないようになっています。 多分あなた方が欲しいのは `1e1000' なのでしょうから。

(*) 練習問題 2. ある一対の整数に対して B コマンドが厳密な有理数を求められたはずなのに、 そうしない例を挙げなさい。 算術 練習問題 2 解答「B コマンドのつまずき」 参照 . (*)

その他の関数

Calc はまた、順列組合せや統計学に関する関数群も持っています。 あなたは factorial(階乗) 関数をご存知でしょう。 これは与えられた数以下の全ての整数の積を計算します。

1:  100        1:  93326215443...    1:  100.       1:  9.3326e157
    .              .                     .              .

    100            !                     U c f          !

繰返しますが、c f コマンドはスタック top の整数または分数を 浮動小数点形式に変換します。浮動小数点値の階乗を取ると、現行精度レベルで 正しい浮動小数点の結果が得られます。しかし整数値に ! を効かせると、 厳密な整数の結果を計算させることに(この場合は158桁)なります。
(訳注: 普通必要無いだろ。やるなら覚悟してやれ。という意味)

非整数の階乗を取ると、 Calc はより一般化された階乗関数(オイラーのガンマ関数として定義されている) Γ(n) を利用します。(ガンマ関数自体は f g コマンドとして利用できます。)

3:  4.         3:  24.               1:  5.5        1:  52.342777847
2:  4.5        2:  52.3427777847         .              .
1:  5.         1:  120.
    .              .

                   M-3 !              M-0 DEL 5.5       f g

これで、恒等式 n! = Γ(n+1) を検証しました。

二項係数(binomial coefficient) nm は全ての実数 nm に対して次のとおり定義されています。 n! / m! (n-m)! この式の結果が小さい値の場合でも、中間結果は相当大きな値になり得ます。 k c コマンドは、その大きな中間結果を回避する方法で二項係数を計算します。

k プリフィックス・キーは順列組合せや数論に共通の関数群を定義します。 ここで2項係数30C20を計算し、それを素因数分解してみましょう。

2:  30         1:  30045015   1:  [3, 3, 5, 7, 11, 13, 23, 29]
1:  20             .              .
    .

 30 RET 20         k c            k f

これらの素因数を確認するために、 v u を使ってベクトルを8つのスタック項に「分解」し、 M-8 * でそれらを掛合せて元に戻るか見てみましょう。 結果は、元の数 30045015 に戻ります。

10000 エントリ以上のハッシュテーブルが必要なプログラムを開発中だとしましょう。 ハッシュテーブルの実際の大きさは素数にするのがベストです。 Calc は 10000 の後に来る素数を計算できます。

1:  10000      1:  10007      1:  9973
    .              .              .

    10000          k n            I k n

おまけに、10000 の前に来る素数も計算しました。

財務関数(pv, rate, sln 関数など)を扱うコマンド群の 詳細は、Financial Functions 参照 .

and, xor, lsh のような、2進数の演算コマンドについては Binary Number Functions 参照 .


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