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


モード設定コマンド群(Mode-Setting Commands)

Calc は多種類の モード を持っていて、それがコマンド解釈やデータ表 示の仕方に影響します。我々はすでにひとつ、代数モードを見ました。他にも沢 山あって、ここでは最も普通のモードをいくつか試しましょう。

計算精度

Calc で最も重要なモードはおそらく今現在の「計算精度」です。 Calc ウィンドウのモードラインにある `12' に注目してください。

--%%-Calc: 12 Deg       (Calculator)----All------

記号の大半は Emacs のもので、気にする必要はありませんが、`12'`Deg' はモード表示です。`12' は計算が12桁の有効数字を伴うこと を意味します。1 RET 7 / とタイプすると 0.142857142857 という結果が得られ、計算結果の頭やおしまいのゼロを別にするとちょうど12桁 になるのはこういう理由からです。

p を押して、それから好きな数を入力することで、 いくらでも好きな計算精度に設定できます。 p 30 RET と打ってから、 もう一度 1 RET 7 / を試してください。

1:  0.142857142857
2:  0.142857142857142857142857142857
    .

計算精度は任意に高く設定できますが、Calc は常に現行精度での 何らかの 値を持たねばなりません。結局、 1/7 の真の値は無限に繰り返す循環 少数ですが、Calc はどこかで止めなければなりません。

もちろん、精度を高くすると計算はそのぶん遅くなります。 p 12 を押して精度を元に戻しましょう。

計算は常に現行精度で行われます。例えば、スタック上にたとえ30桁の 1/7 の値を置いていても、それを12桁モードで計算に使えば計算前に12 桁に丸められます。RET を押して数値を複製し、それから 1 + を押してみてください。RET は計算を行わないので、RET を押した ときには「丸め」は起こらないことに注意してください。しかし + を押 した途端に数値は丸められました。

1:  0.142857142857
2:  0.142857142857142857142857142857
3:  1.14285714286
    .

実際、我々は左に1桁加えたので 1/7 の12桁値から右側1桁が失われてし まいました。

整数と浮動小数の計算精度

以前 `2^3^4' を計算したときに、 どうして12桁以上の答を得たのでしょう? その答は、Calc が 整数浮動小数(フロート) を見分けるからです。 整数とは小数点を含まない数です。「無限に繰返す整数」などありませんから、 Calc は計算を自粛しなくても良いのです。 もし `2^10000' の値を聞いたら(原文: 試さないでください!)、 長時間待たされますが厳密な答を得ます。
(訳注: 試してよい。Celeron 400MHz クラスのパソコンなら、 10秒程度で3011桁の答が得られる。 `2^100000' ともなるとさすがに15分程待たされるので、 こちらはお薦めできない。答は3万桁以上ある。) `2.^10000' を計算させたら、すぐに12桁精度の答が得られるでしょう。 小数点は Calc に厳密な整数演算ではなく 浮動小数点演算を使うように指示しているのです。

F(calc-floor) コマンドを使うと浮動小数点の値を整数に、 c f (calc-float) コマンドは整数を浮動小数点形式に変換します。

先ほどの計算を試して見ましょう。

1:  2.         2:  2.         1:  1.99506311689e3010
    .          1:  10000          .
                   .

  2.0 RET          10000 RET      ^

文字 `e' が混じっていることに注意してください。これは「かける10のN 乗」を意味していて、そのままでは必要以上のゼロがあるときにCalc が自動的 に使用します。この表記法で数値を入力することもできます。

1:  2.         2:  2.         1:  1.99506311678e3010
    .          1:  10000.         .
                   .

  2.0 RET          1e4 RET        ^

おや、答が違う! 2つの例の、真中の列を良く見てください。最初のは スタックに厳密な整数 10000 が入っていますが、 2番目のは小数点のついた浮動小数値が入っています。 整数べき乗する場合、Calc は答を出すために二乗と掛け算の繰返しを使います。 浮動小数点べき乗の場合は対数と指数を使います。お判りのように、 いずれかの方法の最中に小さな誤差が忍び寄りました。 どちらを信じれば良いのでしょうか ? 少し精度を上げて見ましょう。

    .          1:  2.         2:  2.         1:  1.995063116880828e3010
                   .          1:  10000.         .
                                  .

 p 16 RET        2. RET           1e4            ^    p 12 RET

最初の 12 桁を信頼するに足る充分な「ガード(誤差に対する防波堤、結界)桁」を 追加したので、 この高精度演算を整数べき乗でやろうが浮動小数点べき乗でやろうが大差ないでしょう。 そして判定は...整数べき乗のほうが正確でした。 実際、最後の桁がわずか 1 違うだけでした。

Calc は多くの内部演算を少し高めの精度で実行しますが、 常に充分高い精度とは言えません。 それぞれの場合、Calc はおよそ2桁高い精度で演算し、 あとで結果を丸めて12桁に戻しました。 ある場合にはそれは充分でしたが、もうひとつの場合は不充分でした。 もし x 桁の精度が本当に必要ならば、 何桁かのガード桁を追加して演算を実行することは決して無駄ではありません。

表示書式(浮動小数)

ガード桁は必要だが、それを見たくないという場合はどうでしょう ? 我々は フロート書式 を設定することができます。 Calc は normal(浮動小数点), fixed-point(固定小数点), scientific notation(科学表記法), engineering notation(工学表記法)の 4つの主要な書式をサポートします。 それぞれ d n, d f, d s, d e を 押すことによって得ます。 それぞれのケースで、何桁の数字を表示すべきかを接頭引数で指示することができます。 例として、スタックにいくつかの数値を置いて、 いくつか異なった表示モードを試してみましょう。 最初に、M-0 DEL でスタックをクリアして、 それからここに示す4つの数値を入力してください:

4:  12345      4:  12345      4:  12345      4:  12345      4:  12345
3:  12345.     3:  12300.     3:  1.2345e4   3:  1.23e4     3:  12345.000
2:  123.45     2:  123.       2:  1.2345e2   2:  1.23e2     2:  123.450
1:  12.345     1:  12.3       1:  1.2345e1   1:  1.23e1     1:  12.345
    .              .              .              .              .

   d n          M-3 d n          d s          M-3 d s        M-3 d f

M-3 d n をタイプしたとき、数値が有効3桁に切下げられました。 しかしその後 d s とタイプしたとき、全5桁の有効数字が再び現われた事に 注目してください。 フロート書式は数値がどのようにストアされるかに影響せずに、 単に数値がどう表示されるかに影響するだけです。 計算機メモリ内での実際の数値の丸めは現在精度だけで管理します。

工学表記法はここに示していませんが、科学表記法と似ています。唯一違うのは、 指数(10 のべき乗部分)は常に(「キロ」, 「マイクロ」などのように) 3の倍数になるよう調整される点です。 その結果、小数点の前に1〜3桁の数値が出ることになります。

表示関連のモードを変えるときは常に、 Calc はスタック内の全てを描き直します。 もしスタックの上に多くのものがあるなら、これは遅いかもしれません。 そこで、モードコマンドの直前に shift-H をタイプすると、 そのモードコマンドがスタックを更新するのを防止できます。 モード変更コマンドの後に Calc が表示するものは新しい書式で表示されます。

4:  12345      4:  12345      4:  12345      4:  12345      4:  12345
3:  12345.000  3:  12345.000  3:  12345.000  3:  1.2345e4   3:  12345.
2:  123.450    2:  123.450    2:  1.2345e1   2:  1.2345e1   2:  123.45
1:  12.345     1:  1.2345e1   1:  1.2345e2   1:  1.2345e2   1:  12.345
    .              .              .              .              .

    H d s          DEL U          TAB            d SPC          d n

ここで H d s コマンドは画面を更新しないまま科学表記法に切替えます。 スタック TOP 内容をデリートして UNDO で元にもどすと, それは新しい書式で 表現されます;TOP の2つのスタック内容を交換すると両方の内容を再フォーマッ トします。 d SPC コマンドはスタック全体をリフレッシュします。 d n コマンドは普通のフロート書式に戻ります;これは H 接頭 辞を持っていないので、全てのスタック内容を d n 書式に更新します。

整数 12345 がフロート書式のいずれでも影響を受けていなかったことに 注目してください。 整数は整数であって、常に厳密に表示されます。

表示書式(桁まとめ)

大きな整数には特有の問題があります。2^3^4 の結果を思い出しましょう。

2417851639229258349412352

これは何桁あるかすぐ判りますか? d g とタイプしてみてください。

2,417,851,639,229,258,349,412,352

さあ何桁ありますか ? こちらのほうがずっと楽でしょう ! 実際、何桁単位にでもまとめることができます。 M-5 d g を好む人だっています。

24178,51639,22925,83494,12352

浮動小数点型の数値を桁まとめしたらどうなるか見ましょう。 まず、p 25 RET とタイプして、 地獄に飛込む?????ための充分な精度を確保します
(訳注: いまスタックに置かれている「整数」が25桁だからである。 デフォルトの精度12桁のまま浮動小数点型にすれば、下13桁を失ってしまうだろう。)。
さあ1e13 / とタイプしてください。

24,17851,63922.9258349412352

整数部は桁まとめされましたが、小数部はそのままです。 では M-- M-5 d g(メタ-マイナス, メタ-5) を試してみましょう。

24,17851,63922.92583,49412,352

小数点とカンマが見分けにくいなら、d , SPC で桁まとめ文字をス ペースに変えてみましょう。

24 17851 63922.92583 49412 352

d , , とタイプして、桁まとめ文字を普通に戻し、 次に d g で桁まとめを止めてください。 さらに、p 12 を押してデフォルトの精度に戻してください。

表示書式(N進数)

U を何回か押して最初の大きな整数を復活させてください。 (U は各モード設定コマンドを undo しないことに注意してください。 モード設定を undo したければ、自分でやらねばなりません。) さて、d r 16 RET とタイプしてください。

16#200000000000000000000

あの数値は今や 16進または "base-16" 書式で表示されています。かな り簡単な表示に突然変わりましたが驚くにはあたりません。もともとこの数値は 2のべき乗を計算して得たものであり、16は2のべき乗だからです。実際、 d r 2 RET とすれば、値を2進の書式で見ることができます。

2#1000000000000000000000000000000000000000000000000000000 ...

ここには全てのゼロをお見せするスペースがありません! 普通の画面には収ま りません。全てを見るには水平スクロールを使わなければなりません。<> を押して、スタックウィンドウを(その幅の半分単位で)左右に スクロールさせてください。桁数の大きな数を見るもう1つの方法として、 ` (バッククォート)を押せばスタック top を別の編集ウィンドウで編集で きるようになります。(用が済んだら M-# M-# を押してください。)

(訳注 : <で内容が左に動き、右のほうが見えてくる。 ポイントは実質的に動かない。 通常のカーソル移動の感覚と異なるので注意。)

# 記号を使って、非10進の数値を入力することもできます。16進数 `5FE' が2進でどうなるか見てみましょう。16#5FE とタイプしてく ださい(16進文字の入力は大文字でも小文字でも構いません; 常に大文字として 表示されます)。これも d g で桁まとめ機能が利用できます。

2#101,1111,1110

ここで、表示基数が2進か16進の場合 d g がデフォルトで4桁単位の桁ま とめを行うことに注意してください。10進、8進など他の基数ではデフォルトで3 桁単位です。

さあ、10進にしてみましょう。d r 10 をタイプしてください。

1,534

数値は入力時の基数で内部記憶されるわけではありません。それらは単 に数値であって、どの基数ででも入力できますし、いつでも d r で選ん だ好きな基数で表示できます。その表示基数は整数, 小数, 浮動小数に適用され ます。

(*) 練習問題 1. 友人ジョーは3分の1を入力しようとして、 精度12桁、d r 3`3#0.1' と入力しました。表示には `3#0.0222222...' (2が25個)と出ました。これを3倍すると、期待した `3#1' ではなく `3#0.222222...' を得ました。次にジョーは、 `3#0.2' を入力し、画面に `3#0.2' と表示されたのを見て安心しました。 ところが 2 / をタイプすると `3#0.10000001' (ゼロをいくつか割愛) となりました。いったいどうなっているのでしょう。 モード 練習問題 1 解答「3#0.1 = 3#0.0222222?」 参照 . (*)

(*) 練習問題 2. 科学表記法は非10進モードでも普通に働き ます。(このとき指数そのものは常に10進で書かれますが、指数は10のべき乗で はなく、その基数のべき乗です)。つまり `8#1.23e3 = 8#1230.0' です。 ここで16進数 `f.e8f' かける16の15乗を考えてみましょう。 `16#f.e8fe15' と書いたら何がいけないのでしょう ? どう書けばうまくい くのでしょうか ? モード 練習問題 2 解答「16#f.e8fe15 参照 . (*)

角度モード

m キーで始まるもう1つのモード群があって、Calc が入力を解釈したり計 算するやり方に関連しています。一般に、d で始まるモード群がデータの 外見に影響するのに対し、m で始まるモード群はデータが実際に演算され る仕方に影響します。

最も有名な m 系モードは角度モードです。モードラインの `Deg' という表示に注目してください。これは、「数値を角度として扱う コマンドを実行する際、その角度は(degree)単位と見なす」という意味です。

1:  45         1:  0.707106781187   1:  0.500000000001    1:  0.5
    .              .                    .                     .

    45             S                    2 ^                   c 1

shift-S コマンドは角度のサインを計算します。サイン45°は sqrt(2)/2 で、これを2乗すると 2/4 = 0.5 になります。 しかし sqrt(2)/2 の数値表現が完全に厳密ではなかったので、わずかな丸め誤差があります。 c 1 コマンドは、このような場合に手軽に数値を浄化する方法で、 スタック top の数値精度を1桁小さくして丸めなおします。

(*) 練習問題 3. 友人ジョーは上記のとおりにサイン45°を 計算しました。その際、彼は不正確な結果を防ごうとして、2乗する前に計 算精度を16桁に増やしました。どうなったでしょう ? モード 練習問題 3 解答「ジョーの間違い(丸め精度)」 参照 . (*)

この計算をラジアンで実行するには、最初に m r をタイプします。 (モード表示は `Rad' に代わります。) 45°は pi/4 ラジアンです。 pi の値は P キーを押すと得られます。 (繰り返しますが、大文字の P です。小文字の p は精度設定であ ることを思い出してください。)

1:  3.14159265359   1:  0.785398163398   1:  0.707106781187
    .                   .                .

    P                   4 /       m r    S

同様に逆三角関数は、現在の角度モードに依ってラジアンや degree 単位の 結果を出します。

1:  0.707106781187   1:  0.785398163398   1:  45.
    .                    .                    .

    .5 Q        m r      I S        m d       U I S

ここで sqrt(0.5) のアークサインを最初はラジアンで、次に degree で計算しました。

ラジアンを degree に変換したり、その逆変換には c dc r を 使ってください。

1:  45         1:  0.785398163397     1:  45.
    .              .                      .

    45             c r                    c d

分数モード

もう1つの面白いモードは分数モード(fraction mode) です。 2つの整数の除算が割り切れない場合、通常は浮動小数点で結果を出しますが、 分数モードではその代りに分数(すなわち有理数)で結果を出します。

2:  12         1:  1.33333333333    1:  4:3
1:  9              .                    .
    .

 12 RET 9          /          m f       U /      m f

最初のケースでは浮動小数点の近似値が得られます。 2番目のケースでは、厳密な分数値(3分の4)を得られます。

分数はいつでも : 表記法を使って入力できます。(Calc は分数のセパレー タとして / の代りに : を使います。というのは、 / は top の2つの要素を除算する演算コマンドとして使ってしまっているからです。) 分数を使った演算は常に厳密な分数の結果を出します。分数モードは単に、 2つの整数を除算するときどうするのかを指示するだけです。

(*) 練習問題 4. 分数演算が厳密だというなら、 なぜこれまで分数ではなく浮動小数点を使ってきたのでしょうか ? モード 練習問題 4 解答「なぜ浮動小数点か?」 参照 . (*)

m f をタイプしてもスタックに存在する数値は何も変りません。上記の例 では、分数モードに変えたとき、除算を UNDO してまたやり直す必要がありまし た。しかし evaluates-to 演算子を使えば、m f のようなコマンドで再計 算させることができます。

1:  12 / 9 => 1.33333333333    1:  12 / 9 => 1.333    1:  12 / 9 => 4:3
    .                              .                      .

   ' 12/9 => RET                   p 4 RET                m f

この例では、精度を変えたり分数モードに変えたりしたときに、スタックにある `=>' 演算子の右辺が再計算されました。値に影響する可能性のあるモード 変更がなされた時は毎回、スタック上の全ての `=>' 表現は再計算される のです。


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