人気ブログランキング | 話題のタグを見る
スタックの概念は、多くの初級プログラマが分かったつもりになっている
ものの代表格です。

というのも、スタックについて解説している書籍がそもそも少なく、
また解説があったとしても、配列を用いて擬似的なスタックを作っただけで
話が終わってしまっているものが非常に多いためです。

スタックはそもそもCPUに始めから実装されているFIFO方式の機構であり、
メモリ上のスタック領域を使用します。利用目的はデータの一時的退避
ですが、関数を呼び出す処理もこのスタックにより実現されています。

スタックの位置はスタックポインタSPと呼ばれるCPUレジスタにより
管理されていて、PUSH,POP,CALL,RET等の命令により操作されます。

これらの命令はアセンブリ言語と呼ばれる低水準言語です。

自動変数などは、このスタック上に確保されてしまいますので、
画像データなどを配列でどかっとこの領域に確保しようとすると
たちまちオーバーフローを起こします。スタック領域はあまり
大きくないのです。

最近はC言語にしても、Javaにしても多数の入門書が出版されていて
誰もが簡単にプログラムを始められるようになりました。入門の
敷居が下がって誰もがプログラムを始めやすくなったのはよいのですが、
ハードウェアレベルの知識は全く・・・という人が多くなってしまいました。

特にメモリの知識はビル建築で例えるなら土台に相当します。土台がもろくても
ある程度の高さならたえられますが、ある高さを超えた瞬間一気に
崩れてしまうものです。

土台固めにはアセンブリ言語の習得が一番の近道です。
# by pcinfo | 2004-12-25 09:55
今回はBIOS(バイオス)の話をしましょう。

パソコンの電源を入れたとき、最初ディスプレイ上には一体
何が表示されますか?パソコンによって表示されるものに多少
違いはあるでしょうが、少なくともイキナリWindowsなどの
OSが立ち上がるということは無いはずです。

電源を入れてからOSが立ち上がるまでの間に、黒い画面が
出てきて変な文字が表示されたり、またはメーカーのロゴが
表示されたりしていませんか?

実はこの黒い画面の間にせっせと働いてくれているソフトこそ
がBIOS君なのです。


「Basic Input Output System」の頭文字を取ってBIOS、
バイオスと読みます。

OSとは何か?を知っている方は、まぁ大雑把にワープロソフト
やゲームソフトを使うための土台となっている基本ソフト
くらいに理解していると思います。

確かにOSは基本ソフトなのですが、残念ながらハードウェアの
設定などあまりに基本的すぎることまでは面倒を見てくれない
ようなのです。

そこで、OSの役割よりもっと基本的、言いかえるとハード寄り
の設定や調整などを行ってくれる基本ソフトが必要となってき
ます。その役割を果たすソフトこそBIOSなのです。


BIOSもOS同様ソフトウェアですが、OSのようにハードディスク
上に記録されているわけではありません。マザーボード上の
フラッシュROM上に記録されています。このフラッシュROMの
ことをBIOSチップなんて言ったりしています。

(フラッシュROMは、そうですね。今のとこは書き換え可能な
ちょっと特殊なメモリくらいに理解してください)

さて、パソコンは電源を入れますと、まずこのBIOSを読み込み
CPUに命令を出します。そしてハードウェアの設定等々を
終えた後で、OSをHDD上からメインメモリに読み込み、制御を
BIOSからOSに渡します。

このOSに制御を渡すまでがBIOSの役割なのです。
# by pcinfo | 2004-12-25 03:59
コンピュータは0と1の情報しか扱えません。
しかし、私達人間は「0100011100011」などど言われても
何のことやら全く理解不能なわけです。

私達は普段、パソコンを使って、文章の作成をしたり
画像を見たりを当たり前の様にしています。

当然、私達はディスプレイ通じてこれらのデータを見るとき、
画像のデータと文章のデータは別々のデータなんだという
ことは容易に判断できるでしょう。

ですが、残念ながらパソコン君には画像のデータだろうと
文章のデータだろうと音声データだろうと、
0と1の羅列にしか見えないのです。

パソコン君にとっては、あなたが恋人にあてたメールも
ただの0101、子供の運動会のデジカム動画もただの0101、
ダイヤモンド富士を見事に写した高性能デジカメの画像も
所詮0101にすぎんのですよ、わっはっは!!!
(一体何が可笑しいのやら・・・↑)

以上のように、コンピュータにとっては文字も画像も
「ゼロイチゼロイチ」の情報にすぎません。

しかし、私達にとっては文字データと画像データは別物で
あり、「所詮0101の情報にすぎない」からといって
コンピュータにこれらのデータをごっちゃに扱われては困る訳です。

従って、コンピュータにはデータの種類に応じた処理をして
頂かなくてはなりません。そのことを理解するには、第一歩
として、データの分類を理解しておく必要がありましょう。


本題です。コンピュータで扱うデータは

2進数・10進数などの「数値データ」と
文字や画像などの「非数値データ」に大別できます。

一見すると分類はこれだけで十分な気がしますが、
残念ながらそう簡単にはいってくれません。

例えば、2進数は小数の表現の仕方により
「固定小数点数」と「浮動小数点数」に分類されます。

また、文字にしても表現の仕方(コード体系)が様々あり、
例えば、ASCIIコード、シフトJISコード、Unicodeなどを
あげることができます。
# by pcinfo | 2004-12-25 03:58
誤差と一口に言いましても色々と種類がありますが、今回は
10進数の小数を2進数に正確に変換できない場合があるという
話をします。

これはどういうことかといいますと、例えば、10進数でも
1/3なんかは0.33333…となってしまい、

本来1/3を3倍すると1になるはずなのに
0.33333…を3倍しても0.99999…となってしまい、

両者の間に誤差が発生することが知られていますよね?


これと同様に、例えば0.1という10進数の小数は正確に
2進数で表現することはできません。

どのようになるかというと、

0.0001100110011001100...

というように循環小数として表されることになります。

さて、これが一体何の問題があるのかというと、
以下のプログラムを実行してみてください。
これは、0.1を1000回足し合わせるだけの単純なものです。


#include
using namespace std;

int main(int, char **)
{
float sum = 0.0f;

for(int i=0; i<1000; i++){
sum += 0.1f;
}

cout << "合計: " << sum << endl;

return 0;
}

さてどうでしょう。実行結果は期待する100という数値には
なってくれず、99.999となってしまいましたね。

10000回ループしてみると誤差はさらにはっきり現れ、
999.903となってしまいます。

もちろんdouble型にするなど精度を上げることで、
より正確な数値に近づけることは出来ます.

大切なのはプログラミングをする際には、

実数計算には誤差が伴っているんだ

ということを常に意識しておくことです。
# by pcinfo | 2004-12-25 03:57
まず、無限級数というのをご存知でしょうか?

例えば、
1+2+3+4+5+6+…… とか
3+6+9+12+15+…… などで、一般的な式で書くと、

a_0 + a_1・x + a_2・x^2 + a_3・x^3 +……

という風に、無限の和で表現できる式のことです。
(∑を使ったらもっとシンプルに表現できますね^^;)

で、ここからが本題なのですが、この無限級数を使って
皆様ご存知の指数・対数やら三角関数やらを定義する
ことが出来てしまうのです。

そのおかげでこれまで無関係と思っていた関数同士に
実に密接な関係があることが発見できるのです。

それ以外にも無限級数で定義するメリットがありまして、
それは"近似"に使えるという点です。

「近似」とは、例えば3.000000012とかいう数値があったとしますと、

「細かいことをガタガタ言うな、3ってことにしとけ!」

ってことです(^_^;)例えば、1980円の品物があったとしますと
頭の中でもう2000円と一緒って考えちゃいませんか?
意外と私たちは日常において近似をしているものです。

例えば無限級数においてxの値が0.1だったとすると、

a_2・x^2の部分だとx^2=0.01くらいのもんですが、
a_6・x^6とかなってきますと、x^6=0.000001となってしまい、

もうこの部分は無視しても構わなく思えませんか?
このように無限級数を用いた場合、第何項まで計算するか
により、簡単に近似をすることが出来るのです。

で、ある関数f(x)を考えるとき、この関数が無限に微分可能な
関数なら無限級数でその関数を定義しちゃうよん( ̄ー ̄)b

というのをテイラー展開と読んでいます。

テイラー展開(ウィキペディア)
http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B
# by pcinfo | 2004-12-25 03:57