• ベストアンサー

数値計算の高速化 (cos, sin, exp)

数値計算の計算コストに関しての質問です。 webなどで見ていると、「cos, sin, expは計算コストが 高く、高速化のために、他の計算方法で代用できる 場合は代用する」ということが書かれていたのを見ました。 cosやsinの計算にテイラー展開したもので代用する方が 計算が早くなるということでしょうか?

noname#29127
noname#29127

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★乗算はテーブルにすると早い。 ・2桁の『乗算』を『*』演算子で計算するよりも、10×10 のテーブルを  用意して、テーブル参照させると高速になります。また、1桁の参照も  別の1桁テーブル参照をさせると高速になります。→組み合わせる。 ・このようにテーブルを用意して、固定小数点(整数値)で計算させると  高速になります。→『多倍長演算』と呼び、マクローリン展開でどこ  まで計算結果に精度を求めるかです。 ・『マクローリン展開』でも収束するまで計算させるのではなく、回数を  指定して 3~4 で強制的に計算を終了すれば高速になります。 ・収束は倍・倍に精度がよくなるため、3~4 回の計算でも結構よい精度  になりそうです。→試してみましょう。 最後に: ・よく使う数は、『定数』としてテーブルに保存して計算させると高速化  できます。→『マクローリン展開』で利用する『階乗』など。(1!~6!) ・あと、実数値を多倍長の整数値で表現して、あとで小数点と桁数の丸め  込みなどを行えば高速になります。→実数よりも整数が高速だから。 ・『多倍長演算』で検索するといろいろ出てきます。 ・以上。おわり。参考になりましたか? リンク: ・http://yosshy.sansu.org/maclaurin.htmhttp://assam.cims.hokudai.ac.jp/~josch/workshop/math/Maclaurin/Maclaurin1.htmhttp://www.sist.ac.jp/~suganuma/kougi/other_lecture/SE/math/diff/diff.htm

参考URL:
http://www5.airnet.ne.jp/tomy/cpro/longint.htm
noname#29127
質問者

お礼

回答ありがとうございます。 色々具体的に説明をしていただき感謝いたします。また、リンクの 情報もありがとうございます。

その他の回答 (4)

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.5

No.4さんに同意。8ビット機時代ならともかく、現在はFPUがある為、三角関数程度なら下手に近似計算するよりも高速だと思います。うちの会社(ゲーム開発)では普通に使っています。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

PCでやるなら自前で展開式を使っても高速にならないんじゃないかと思う。初等関数くらいはFPU命令であるし、i486以来FPUはCPU内蔵だからね。ソフトウェアで少々頑張ってもCPU内部で最適化されたハードウェア処理にはかなわないんじゃないかな。 # まずは初等関数命令の実行サイクルを確認しておいた方が良いと思う PCでやる前提だと高速化に有効なのは低い精度で済む場合のテーブル参照くらいかな。これもキャッシュを乱して全体としては反って遅くなる場合もあるから要注意だけど。 なお多項式近似についてはマクローリン展開は最適ではないので、もっと効率的に計算できる展開係数がある。同じ精度を出すのに2,3項は減らせるんじゃなかったかな。 近似係数の計算法なんかは「近似式のプログラミング」などの書籍に載っていたと思う。

noname#29127
質問者

お礼

回答ありがとうございます。FPUで最適化されているということなのですね。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> 例としまして、cos xをxの4乗までの計算精度でよい場合 > などは早くなるということでしょうか? > (自分で速度を測ってみます。) こちらは、処理系によりけりですので、測ってみるしか無いですね。 コストがかかるとは言っても、下手な計算アルゴリズムやコンパイラの最適化性能が悪いと、微妙です。 cos(x)のマクローリン展開にしても、Cの記述で、 例1: y= 1 - x*x/2 + x*x*x*x/4*3*2 - x*x*x*x*x*x/6*5*4*3*2; (xに関する乗算が9回、その他の乗算が6回) 例2: double x2=x*x; double x4=x2*x2; double x6=x4*x2; y = 1 - x2/2 + x4/24 - x6/720; (xに関する乗算が3回、ただしdouble変数を確保する処理が3つ) なんてテクニックも一般的です。 さすがに、最適化機能のあるコンパイラなら、定数の乗算はプリプロセッサあたりで処理されるハズですし、xの乗算についてもうまい事最適化するかもしれませんが…。 -- > ~テイラー展開でなく、 > そちらの近似式を使うと計算が早くなる」 > といったことなのだろうか? とも考えてました。 もちろん、そういう近似式もあるかも知れません。 必ずあるとは限らないし、特定の条件でしか成り立たない可能性もあります。 逆に、特定の条件を絞り込めるのなら、より良い近似があるかも知れません。 例: sin(x)を、傾きが+1、-1の直線で場合分けして近似してしまうとか。 /\/ -- No.2さんのような、テーブルを使う方法は有効です。 例: ゲームの話ですが、敵や味方の動き、弾なんかの方向が36方向しか取らない、方向を整数型で持っているので360方向だなんて場合には、 cos(0°) cos(1°) ・ ・ cos(359°) の360個のテーブルを持っておいても、メモリは大して圧迫されません。

noname#29127
質問者

お礼

あらためて詳細な説明ありがとうございます。 マクローリン展開の計算方法や、テーブルの利用に関して、必要な 精度で処理できるかなど検討してみます。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> cosやsinの計算にテイラー展開したもので代用する方が > 計算が早くなるということでしょうか? どこまで展開するか?→どこまでの精度が必要か?次第です。 展開式が延々と続くなら必ずしも早くないし、計算結果も通常の取り扱いでは無視される精度で出てしまいます。

noname#29127
質問者

お礼

回答ありがとうございます。 例としまして、cos xをxの4乗までの計算精度でよい場合 などは早くなるということでしょうか? (自分で速度を測ってみます。) 「インドの大数学者ラマヌジャンがπに関して考案したような 近似式がsinやcos, expにもあり、テイラー展開でなく、 そちらの近似式を使うと計算が早くなる」 といったことなのだろうか? とも考えてました。

関連するQ&A

  • sinやcosから角度を・・

    テスト勉強でsin(0.3)で角度が、19.45度となる答えがありました。 同じくcos(0.769)で角度が、39.7度となっていました。 この、sinやcosの数値からどうやって角度を求めるのでしょうか? 関数電卓でもその方法わかりません。 手計算でも求められるのでしたら、その方法を教えていただけないでしょうか?

  • cosθの近似について質問です。

    cosθの近似について質問です。 θ1、θ2を微小とするとテイラー展開よりcosθ1=(1-θ1^2/2),cosθ2=(1-θ2^2/2),sinθ1=θ1,sinθ2=θ2となると教科書ではしているのですが、cos(θ1-θ2)は教科書によると1になっているんですがこれはどうやったのでしょうか?(三次以上の微小量は無視)

  • テーラー展開で数値を求めたいのですが・・・

    cos0.1の値を少数第5位まで求めたいのですが、 cosxをx=0.1でテーラー展開するのか、 それともcos(0.1x)をx=1でテーラー展開すればいいのか、 もっと簡単な方法があるのか… また、これからこういったテーラー展開で数値を求める問題に取り組む時、どの関数をテーラー展開すればより簡単に求まるかを見分つけるほうほうがあれば教えて下さい!!お願いします。

  • ローラン展開の一意性について

    ローラン展開の問題を解いていたら z exp(1/x) (0<|z|<∞) という問題が合ったのでexp(1/x)をテイラー展開しようと奮闘していたのですが、力尽きて調べてみると「それは解けません。exp(x)のテイラー展開に1/xを代入します」とありました。 これってどんな場合にも成り立つのでしょうか。 例えば指数関数だけでなく、cos(1/x)とかsin(x^2)なんて問題が出たときにもよく知られるeやcosやsinのテイラー展開の結果の式に代入したらそれで解決なのでしょうか。 もし、どんな場合にも成り立たないのであれば、成り立つための条件を教えて頂けるとうれしいです。 よろしくお願いします。

  • sin、cosの質問です

    sinθ+cosθ=1/2のとき 1、sinθ cosθ 2、sin3条θ+cos3条θ 3、sin4条θ+cos4条θ 回答があり、答えは分かるのですが 久しぶりに解こうとしたら、計算方法が分かりません 計算の仕方を教えてくださいm(_ _)m

  • sin(180-Θ)やcos(180-Θ)について

    sin(180°-Θ)=sinΘ cos(180°-Θ)= -cosΘ 自分の使っている参考書の この公式についての説明で 「左辺のsin(180°-Θ)、cos(180°-Θ)のΘに第一象限の角を入れて、その符号によって右辺の符号を決定する。」 と書かれていて この部分はなぜ「第一象限の角」という条件がつくのか理解できず ここで質問させてもらった時に 「公式の覚え方だろう」という回答をいただいたのですが どうしても気になってしまい出版社に問い合わせたところ 「変形公式は、すべて任意の角度θについて成り立つ公式です。 これは左辺を、加法定理で展開すると右辺が得られることから分かります。 ですから、θに任意の角度、例えば第1象限の角として30°を代入しても成り立ちます。 θは任意でいいですから、これに120°を代入しても成り立ちますが、 cos(180°ーθ)の場合、左辺は正となり、だからといって、右辺は+cosθと、+を付けては間違いですね。右辺はーCOSθが正しいからです。これはCOSθが負だからですね。 θに数値を代入して、 「左辺が正なら、右辺に+、  左辺が負なら、右辺にーをつける」 とするためには、右辺のcosθ、sinθ、tanθが正である必要がありますので、 そのために第1象限の角度θを使えばいいのですね。ですから、θに60°を代入してもOKです。」 という返事をいただいたのですが 書いている事の意味がいまいち理解できませんでした。 この説明は、「公式の覚え方」として「第1象限の角度」を入れると考えてもいいのでしょうか?

  • cos(sin(x))のx=0のにおけるテイラー展開

    cos(sin(x))のx=0のにおけるテイラー展開をx^4の項まで求めよという問題で解答は 1-(1/2)(x-x^2/6)^2+(1/24)(x^4) となっているのですが、x^3/6ではなくx^2/6となっているのは何故でしょうか

  • sin(x) は電卓ではどのように計算される?

     sin(x) は PC や電卓ではどのように計算されているのでしょう。テイラー展開かなと思ったのですが、x = 0 における sin(x) の n = 5 までのテイラー展開(マクローリン展開)は   x - x^3/3! + x^5/5! = x - x^3/6 + x^5/120 となり、グラフを描くと -π/2<x<π/2 の範囲では十分使えそうですが x = ±πに近いところでは誤差が大きくなります。   π/2 ≒ 3.141592654/2 ≒ 1.5708   1.5708 - 1.5708^3/6 + 1.5708^5/120 = 1.00452492887866   3.1416 - 3.1416^3/6 + 3.1416^5/120 = 0.524044823764988

  • exp(-π(t^2))のフーリエ変換の積分計算で

    f(t)=exp(-π(t^2))のフーリエ変換の積分計算でつまずいています。 ∫(-∞->∞)f(t)*exp(-iωt)dt で、exp(-iωt)をオイラーの公式でcosとsinの式に直し、偶関数、奇関数の性質からsinの項が消え、 2∫(0->∞)exp(-π(t^2))*cos(ωt)dtとなりました。 しかし、eの指数部分のt^2が厄介で積分ができません。 積分方法、または別解がありましたらご教授いただけると幸いです。

  • 2sinθ+cosθ

    2sinθ+cosθ を γsin(θ+α) の形に直すという問題があり、 三角関数の合成公式により、 √5sin(θ+α) となりますが、ここからの算出方法は存在するが、 数Bの範囲では必要ないようで、 その後に、「ただしαは・・・」 と書けばよいとのことですが、 実際に具体的にαの値を出すにはどのような計算をするのでしょうか? (私は高校生でもなく、ただ数学Bの復習をしている人間です。)

専門家に質問してみよう