プロが教えるわが家の防犯対策術!

昔、CPUが行う計算について習ったとき、確か、足し算しかできなかった記憶があります(間違っていたらすみません)。

指数関数EXP(x)などの複雑な(?)数式を計算するとき、CPUはどのように計算しているのですか。
予想では、近似値を求めるアルゴリズムを利用して、CPUが計算できるような形式に変更してるとイメージを持っています(正しい?)。
指数関数の解法にはどのようなアルゴリズムを使っているのですか?
アルゴリズムはOS~アプリソフトの中でどの階層(部分)にあるものなのですか?

ハード・ソフトの違いや、世代によってもやり方はことなるのかもしれませんが、教えてください。
一般のWindows OFFICE EXELあたりではどうなのでしょうか。

数学関数には、それぞれに、解法アルゴリズムが作られ利用されているのですか
例えば、双曲線関数はなどうなのでしょうか

A 回答 (4件)

昔の8bit CPU は確かに整数の足し算しかできなかったので、


浮動小数点の指数関数をアセンブラで実装するのは大変でした。
浮動小数点の四則演算から実装する必要があったので・・・

今は各種の浮動小数点形式の四則演算を CPU が直接
サポートしているので、指数関数の実装は簡単です。

基本的には、テイラー展開を用います。
実際には打ち切り誤差や桁落ちなど、いろいろと考慮すべきことがありますが、
枝葉末節なので割愛します。

#蛇足ですがIntel系の場合、SSE命令などによる高速化も行われているそうです。
    • good
    • 0
この回答へのお礼

良くわかりました。
大変に有難う御座いました。
お礼が遅くなり申し訳御座いません。

お礼日時:2013/07/19 16:08

整数演算しかできなかった時代のCPUには浮動小数点演算専用のプロセッサ(FPU/Floating Processing Unit、NDP/Numeric Data Processor)がオプションとして用意されていました。



intelの数値演算プロセッサとしては、80486までの数値演算プロセッサがあります(80586も存在したが、対応する80586が登場せず、NDP内蔵のPentiumに移行したので幻のFPUになった)。
http://en.wikipedia.org/wiki/X87

FPUの中では、ワイヤードロジック(演算回路)やマイクロプログラムによって計算が行われます。既にあるように級数展開したアルゴリズムをベースにチューニングした方法で計算しますが、その計算の微小部分では既に計算してある表を参照するなどのテクニックを使って演算速度を稼いでいます。

過去にこの参照表が間違っていたことに起因する、PentiumのFDIVバグというのが発生し、結構話題になりました。
http://ja.wikipedia.org/wiki/Pentium_FDIV_%E3%83 …
    • good
    • 0
この回答へのお礼

良くわかりました。
大変に有難う御座いました。
お礼が遅くなり申し訳御座いません。

お礼日時:2013/07/19 16:09

数値計算というのはとてもわくわくする仕事で、収束演算などで前回との差がどんどん小さくなり始めるとヤッター!という感じです。


ソフトに内蔵されている実際のプログラムはいろんなことを考えて素人目には難しくなっていますが、級数展開などで自分で作ったプログラムでも結構うまくいくものです。
そして何よりいいことは収束の良さとか数学で問題にしていることがなんとなくわかることです。
ぜひ自分でプログラム作ってやってみてください。


EXP(x)=1+Σ(n→∞)(i=1,n)x^i/i!

のような級数展開を使う場合、xが1以下の場合n=10でも驚くほどよく収束します。sinやcosも同様です。しかしtanはひどい目にあいます。tanx=sinx/cosxを使うのがよいでしょう。

双曲線関数

cosh(x)=(e^x+e^(-x))/2はe^x,e^(-x)の級数展開を使って簡単に求められます。sinh(x)も同じです。tanh(x)はやったことはありませんがたぶんtanh(x)=sinh(x)/cosh(x)を使うとよいでしょう。

ベッセル関数もきわめて身近に感じられます。

もっと面白いのは数値積分で、解析解と比較して答えがあっているとカタルシスを感じます。どんなゲームより面白いでしょう。

正規分布関数は数値積分で極めてよく収束します。確率統計もぐっとやりやすくなります。
    • good
    • 1
この回答へのお礼

良くわかりました。
大変に有難う御座いました。
お礼が遅くなり申し訳御座いません。

お礼日時:2013/07/19 16:09

指数関数と三角関数は、テイラー展開で級数の形に展開することができます。


しかし、漠然とテイラー展開を実装しただけでは、情報落ちなどの誤差が大きくなります。

極力、引き算をさせないように一工夫してあげると、誤差が小さくなります。

興味があれば、「数値解析」や「数値計算」を勉強されるといいでしょう。
    • good
    • 0
この回答へのお礼

良くわかりました。
大変に有難う御座いました。
お礼が遅くなり申し訳御座いません。

お礼日時:2013/07/19 16:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!