高校数学の窓過去問検索

質問<3578>2007/7/7from=jan5「電算機のシステム」

電算機の分数の出し方を教えてください。




いやあ、これは難問ですね。
一つに、非常に抽象的な質問だ、と言う事があります。電算機、とは言われても根底的なハードウェアレベルの事の質問でしょうか?だったとしたらそれは数学では無くって、どっちかと言えば工学の問題です。それ相応の専門家にお聞きした方がイイと思います。
もう一つは、『電算機』とは言っても、細かい話をすれば仕様が全て違うので、仮にこの問題の答えが分かる人がいても、一般的な回答として成り立つのか否か?と言った問題があります。例えばウィンドウズ機は一般にIntel製のCPUで計算させますが、中にはAMDと言うメーカーが作ったIntel製チップのクローンのCPUを用いたウィンドウズ機もチラホラあります。そして、最終動作は確かに変わんないんですが、CPUの中身のレベルで果たして同じ動作をしているのかどうか保障の限りではありません(全く同じだったら著作権的にはマズいのです)。つまり、扱ってる機械語が違うのです。同様の問題が、例えば任天堂のWiiと言うゲーム機なんかにもありますよね。中身のCPUはモトローラ社のPower-PCと言う電算機です。これも設計がインテルのCPUと丸っきり違います。と言う事は、機械語も違うワケで、帰納的に一般的なハードウェアレベルの話をするのが難しい、と言う意味になります。
最後に僕がハードウェアの中身まではそんなに詳しく無い、って事もありますね(笑)。でもアセンブリ辺りには興味がありますんで、ざーっとググればある程度の仕組みは分かるかな?と思って調べてみました。調べてはみたんですが・・・・・・。

アセンブリで分数表記?

そんなのは無かったんですね。
ザーっと見た感じですと、

アセンブリでの除算の方法論

ってのは確かにありました。その内容を理解出来るか出来ないか、と言うのはともかく(笑)、除算はあっても分数ってのは無いんですね。ありゃまあ。こりゃ困った。除算と分数ってのは数学的には操作が同じ事を指しますが、必ずしもハードウェア上で同じ事を指し示すとは限らないでしょう。う~~~む・・・・・・。

ちょっとここで視点を変えてみます。一般的なプログラミング言語仕様である静的型付け言語と言われる言語の種類があります。静的型付け言語、とは変数を使う場合一々その変数の種類(例えば整数であるとか小数であるとか)を明示しなきゃならない言語の種類ですね。例えば有名なトコで言うと、Microsoftが作って地上で最も優秀なBASIC言語であると言われているVBAとか、ないしはオペレーティングシステムを記述している言語であるC言語、なんかです。
ちょっとここではVBAで定義されている型の種類、を見てみましょう。


※:VBAの概念を知ろうより転載。

う~~ん・・・・・・。ザーっと見る限り、まずは数学で定義されている数の種類に合わせている、と言うより圧倒的にコンピュータで扱えるデータなのか否か?と言うカンジで種類が分けられているのが特色です。この辺りはやっぱり数学より工学寄りなんですね。
それよりもっと着目して欲しいのは・・・・範囲の項目をより良く見てほしいんですが、ここで定義されている数値は整数、ないしは小数であって分数ではない、と言った部分です。もっと言っちゃうと分数と言う型は定義されていない、と言うのが特色です。数学的には数、と言う概念であったら整数だろうと小数であろうとはたまた分数であろうと、原理的には全て同一に扱えるハズなんですが、コンピュータは違うようです。違うからこそ、こう言う型の宣言と言うのが必要になるワケで、そして型が定義されていない、と言う事は逆に言うとコンピュータでは分数が扱えないのではないか、と言う危惧が生じます。
いや、でもVBAだからでしょ?と言う反論も聞こえてきそうなんで、ではもっとプロ用に設計されているハズのC言語だったらどうだ?ちょっと見てみましょう。引用元はC言語の教科書としては名著と言われているカーニハン&リッチーのプログラミング言語C ANSI規格準拠からの抜粋です。






char

文字

short int, int, long int

それぞれ整数(最大値、最小値が違う)

float, double, long double

それぞれ(精度の違う)小数


何てこった(笑)。VBAより型の種類が減っています(爆)。こう言うのをヤブヘビと言うんでしょうね(笑)。
これは当然で、C言語はコンパクトさを目指して設計されています。かつ非常に低レベルの言語(ここで言う低レベルとは、レベルが低い、と言うような意味ではなく、より機械語に近いレベルで動く、と言う意味)なんで余計な要素は一切入れてなく、恐らくアセンブリにより近い『最低限の設計』となってるんでしょう。もちろん、ライブラリを追加すればもっと型が増える事はあり得ますが、取り合えずここに挙げた3種類が最低限の型の実装のようです(逆に言うと、色々な事を手軽に行うように設計されている為、VBAでは型が増えてる、と言える)。つまり、C言語≒アセンブリと考えればコンピュータで分数は扱えないと言うのが結論となりそうです。

とここまで書いて来て、結論付けても良さそうなんですが、一方Schemeと言う言語では分数が扱えるんですよ(笑)。あれ?何ででしょうね(笑)?
論より証拠。ちょっと画面写真を見てもらいましょう。



ここではSchemeの特徴である前置記法を計算させています。んで見事に解がと表示されていますね。不思議です。
では、Schemeでは例えばfraction(分数)なる型が存在してるのか?と言うような話になるんですが、残念ながら少なくとも表面的にはそんな型はありません。と言うよりSchemeはVBAやC言語と違い型を宣言する必要が無い動的型付け言語と言われる言語の一種です。こう言う型宣言が無いプログラミング言語が最近の流行りで、例えばPerl、Python、Rubyなんかの比較的新しい言語もよっぽどの必要性が無ければ型を宣言する必要はありません。内側では色々やってるようですが、少なくとも言語を使ってプログラムする側から言うと、『今から書く数値はどんな型だ?』と悩む必要性が無いのです。
さて、これで分かるのは、


  1. コンピュータの内部では分数を直接計算するような仕組みは無いと見て良さそうだ。

  2. しかしながらコンピュータで分数を表示する事は可能なようだ。

と言う一見相反する二つの命題です。果たしてこれは一体どう言う仕組みなんでしょう?
ここからは僕の想像ですが、例えばと言う命令をコンピュータに計算させるのではなく記号処理するのは可能だ、と言う事です。つまり、と言う文字に変換しろ、と言うような命令は充分可能でしょう。つまり、は数値ではなくって文字なんです。
しかしながら、を単純な文字のままにしてしまうと今度は計算が成り立ちません。そこで実際に裏でを計算しておきます。C言語の用語ではfloatとしての計算結果をメモリ上に保持しておくのですね。そして、コンピュータ上では、例えばxに8を代入するのは簡単なので、ポインタを上手く使ってと言う文字と小数で計算したの計算結果を関連付けてしまう。こうすれば文字として呼ばれた分数もハードウェアレベルでは小数として計算が可能です。恐らくそう言う仕組みになってるんでしょう。
いずれにせよ、根底的なハードウェアレベルでは分数の計算をしているワケではなくって(それで恐らく出来ないでしょう)、もっと高次元のソフトウェアのレベルではないと分数処理は難しいのではないか、と想像します。
万が一の為に、リファレンスとしてSchemeの仕様書へのリンクを以下に貼っておきます。もし、プログラムの知識が豊富でしたら、そっちを参照した方が良いとは思います。



Revised5 Report on the Algorithmic Language Scheme

0 コメント: