すごい初心者なんですが、誰か教えてください。
最近VC++をやり始めて、本とかをいろいろ見ています。
三角関数(sin,cos,tanなど)を計算したいんですが、どうしても
わかりません。誰か教えてください。
ANSI C ライブラリ関数にあるようです。
すべて関数を使う前に
#include <math.h>
でインクルードした後、
sinは
double sin(double x);
cosは
double cos(double x);
tanは
double tan(double x);
他にも絶対値を求めたり、平方根・累乗を求めたりもできます。
使い方は、たとえば、
double a;
a = sin( 3.14 );
のようにです。
#include <math.h>を使わなくても利用する方法があります
整級数展開してください.
例)
Sin x = Σ
#include <math.h>を使わなくても利用する方法があります
整級数展開してください.
例)
Sin x = Σ
#include <math.h>を使わなくても利用する方法があります
整級数展開してください.
例) ∞ (-1)^n 2n+1
Sin x = Σ ------------ x
n=0 (2n+1)!
同様に cos , ex,Sin-1,Tan-1等も求められます.
必要な精度が得られるまで繰返してください.
すみません,バグって途中送信を二回もしてしまいました・・・すみません
ゴミでした.
こんばんは、melroさん。はじめまして。
melroさんの書込みをみて、ひょっとしてmelroさんは数学が好きなんじゃないかと思いましが
どうでしょうか。実は、僕も数学が好きで、melroさんの書込みを見てうれしくなってしまいま
した。どっかでみた数式だな~って思って、かなり久しぶりに微分積分の本を調べてみたら、
melroさんの公式が書いてありました。整級数展開は別名、マクローリン級数ともいうみたい
ですね。ちなみに、cosxは
cosx = 1 - (x^2)/(2!) + (x^4)/(4!) ------ + ( (-1)^n * x^(2n) )/ ( (2n)! )
みたいですね。なぜこうなるかはナゾですが・・・。後ろの方に行けば行くほど、小さい数
で微調整してるのかな。
現時点のPCでは、ライブラリの関数を使うのがベストだと思います。
自前でやる方法は短所の方が多いからです。
(遅くなりやすい、つまらないバグの為に時間を失いやすい等 )
古典的なテーブル参照の方法も、キャッシュのストールの為、
私の環境(Win2K+SP2,VC++6.0+SP5,Athron)では遅かったです。
工夫すれば速くなるかもしれませんが、努力の価値を見出せません。
展開系の勉強をしたい、収束速度を自分で調節したい等の理由が無いのなら
「ある物を使う」のが最良だと思います。
そうとうな変人でもない限り
普通#include <math.h>を使うと思います(爆
みなさん、たくさんの方法を短時間でありがとうございます。
学校でfortoranを使っていたんですが、来年から、カリキュラムが
かわり使わなくなるので、三角関数ができるものを探していました。
大きな書店で多くの参考本を見ても、書いてないので困っていたところです。
本当にありがとうございました。
ひょっとしてですが,ほんと,ひょっとしてですが,
どうせmath.hも,級数展開とかしてるんだから
不要な精度を省略するという面から考慮すれば,
前述の方法を採用することは非常に意義のあるものかも
知れません(笑
既に解決済みですが、ちょっと気になったので。
> どうせmath.hも,級数展開とかしてるんだから
級数展開を基本にはしているでしょうが、高速化や最適化を考慮に入れたものになっているは
ずなので、公式をそのまま使っているということはないと思います。精度を厳密に考慮する必要
がないなら、mathライブラリの方があらゆる意味で効率が良いはずです。
> なぜこうなるかはナゾですが・・・。後ろの方に行けば行くほど、小さい数
> で微調整してるのかな。
元はTayler展開定理です。大学の数学科1年で必須の内容(もちろん証明込み)です。でも、
計算とかシミュレーションとか精度が問題になるプログラムを組む人にはきちんと勉強して欲し
い事柄ですね。
僕は,数学苦手です,テヘッ
>級数展開を基本にはしているでしょうが、高速化や最適化を考慮に入れたものになって
いるは
>ずなので、公式をそのまま使っているということはないと思います。精度を厳密に考慮
する必要
>がないなら、mathライブラリの方があらゆる意味で効率が良いはずです。
VC++の場合,CPUのfsinなどの命令を利用しますので,
相当精度を落とさないと速度で負けます。
あと,long doubleの精度で妥協している限り,sinlと大して結果はかわらないです。
#C++だとlong double std::sin(long double);