
昔、CPUが行う計算について習ったとき、確か、足し算しかできなかった記憶があります(間違っていたらすみません)。
指数関数EXP(x)などの複雑な(?)数式を計算するとき、CPUはどのように計算しているのですか。
予想では、近似値を求めるアルゴリズムを利用して、CPUが計算できるような形式に変更してるとイメージを持っています(正しい?)。
指数関数の解法にはどのようなアルゴリズムを使っているのですか?
アルゴリズムはOS~アプリソフトの中でどの階層(部分)にあるものなのですか?
ハード・ソフトの違いや、世代によってもやり方はことなるのかもしれませんが、教えてください。
一般のWindows OFFICE EXELあたりではどうなのでしょうか。
数学関数には、それぞれに、解法アルゴリズムが作られ利用されているのですか
例えば、双曲線関数はなどうなのでしょうか
No.3ベストアンサー
- 回答日時:
昔の8bit CPU は確かに整数の足し算しかできなかったので、
浮動小数点の指数関数をアセンブラで実装するのは大変でした。
浮動小数点の四則演算から実装する必要があったので・・・
今は各種の浮動小数点形式の四則演算を CPU が直接
サポートしているので、指数関数の実装は簡単です。
基本的には、テイラー展開を用います。
実際には打ち切り誤差や桁落ちなど、いろいろと考慮すべきことがありますが、
枝葉末節なので割愛します。
#蛇足ですがIntel系の場合、SSE命令などによる高速化も行われているそうです。
No.4
- 回答日時:
整数演算しかできなかった時代の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 …
No.2
- 回答日時:
数値計算というのはとてもわくわくする仕事で、収束演算などで前回との差がどんどん小さくなり始めるとヤッター!という感じです。
ソフトに内蔵されている実際のプログラムはいろんなことを考えて素人目には難しくなっていますが、級数展開などで自分で作ったプログラムでも結構うまくいくものです。
そして何よりいいことは収束の良さとか数学で問題にしていることがなんとなくわかることです。
ぜひ自分でプログラム作ってやってみてください。
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)を使うとよいでしょう。
ベッセル関数もきわめて身近に感じられます。
もっと面白いのは数値積分で、解析解と比較して答えがあっているとカタルシスを感じます。どんなゲームより面白いでしょう。
正規分布関数は数値積分で極めてよく収束します。確率統計もぐっとやりやすくなります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0での小数点の扱いについて
-
c languageで 簡単な質問があ...
-
浮動小数演算は実行環境の変化...
-
Log関数に関する質問
-
PICで小数点の演算
-
計算の丸め誤差の解消について
-
Double型について
-
ExcelのINT関数の計算結果がお...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラムでの数字につく”f”の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
EXCELの関数"STDEV(標準偏差)"...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
floatの有効桁数
-
255の2の補数、B'00000001'が-...
-
O(n log n)について2
-
符号誤り率の計算は例題でどの...
-
CRCの計算方法について
-
VB.net Double と...
-
コンピューターは指数関数をど...
-
16進数 加算 減算 C言語
-
ExcelのINT関数の計算結果がお...
-
C言語でセルオートマトンを作成...
-
BCD・HEX・BINについて
-
”/”を使わずに割り算したいんで...
-
三角比の俯角の計算
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
おすすめ情報