昔、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で質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
O(n log n)について2
-
”/”を使わずに割り算したいんで...
-
100桁の計算ができなくて困って...
-
PICマイコンのアセンブラについて
-
C18(PIC18)でのシフト演算など
-
BCD・HEX・BINについて
-
2の補数について
-
c languageで 簡単な質問があ...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
std::set<int> で、ある値が何...
-
「Aに対するBの割合」と「Aに対...
-
ウィンドウハンドルがメッセー...
-
プログラムでの数字につく”f”の...
-
ある商品のロス率を5%見込み、...
-
10進数からN進数に変換するプロ...
-
ループを途中で抜けたいのですが。
-
C#のコンパイルエラーCS0120に...
-
float型とdouble型の変数の違い...
-
数学のテストからの質問(反比例)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
VB.net Double と...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
VB6.0での小数点の扱いについて
-
”/”を使わずに割り算したいんで...
-
距離から緯度経度を求める方法
-
VBAでミリ秒まで出力する方法
-
floatの有効桁数
-
コンピューターは指数関数をど...
-
時刻の比較
-
計算の丸め誤差の解消について
-
Double型について
-
powf を使わずにべき乗を計算
おすすめ情報