math.hについての疑問

このQ&Aのポイント
  • math.hを使うとsin, cos, tanなどの関数が利用できますが、内部ではsinf, cosf, tanfなどが呼び出されているようです。
  • sin関数の計算方法について詳細を知りたいが、math.hにはその情報は書かれていないようです。おそらくライブラリ化されているのかもしれません。
  • math.hを使っている場合、sin関数などの計算はmath.dllなどのライブラリが呼び出されている可能性があります。
回答を見る
  • ベストアンサー

math.h等について

■質問1 #include <math.h> と書くだけで sin, cos, tan 等の様々な関数が使えますが、 inline float __CRTDECL sin(_In_ float _X) {return (sinf(_X)); } inline float sinf(_In_ float _X) {return ((float)sin((double)_X)); } などとなっていてsinがsinfを呼び出し、sinfがsinを呼び出し、sinが・・・ とグルグル回ってる気がするのですが実際どうなのでしょうか? ■質問2 質問1で述べたように実際にどのような計算でsinの値が弾かれているかわかりません。 マクローリン展開で近似された式を利用してsin関数ができると思うのですがmath.hをずっと眺めていてもみつかりませんでした。 どこに書いてあるのでしょうか? math.dllのようにライブラリ化しちゃってるのを呼び出してるだけなのでしょうか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

C++の多重定義は理解できてますか? C++では引数の型によって別の関数として定義することができます。 > inline float __CRTDECL sin(_In_ float _X) とあるfloatを引数とするsinと > {return ((float)sin((double)_X)); } でdoubleを引数にしたsinとは別の関数になります。 引数の型まで含めて同じか別かを考えて追い掛ければ、最終的なものに辿りつけるはずです。 > ■質問2 > math.hをずっと眺めていてもみつかりませんでした。 通常、ヘッダファイルには、プロトタイプ宣言だけを書きます。例外はインライン関数とかテンプレートとかのコンパイル単位で定義が必要なものです。 > math.dllのようにライブラリ化しちゃってるのを呼び出してるだけなのでしょうか? DLLのような動的なものか、.libのような静的なものかはちょっと調べないとわかりませんが、予めコンパイル済みのものを使っているのが普通です。 ソースが公開されているものならそれを見れますが、そうでないなら、技術資料に頼るか、逆アセンブリで解析するか、あきらめるか、になります。 それに、最近のCPUだと、浮動小数点数の計算には専用の回路(FPU)を使っていて、三角関数なら「計算プログラム」はFPUに組込み済み、CPUからは1命令で呼びだしているだけ、ってこともあります。

devman
質問者

お礼

Cを勉強していたので、C++の多重定義は知りませんでした! 調べた結果理解することができました! 質問2については とても難しいそうですが理解できるように頑張ります!

その他の回答 (1)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

環境がわからないので、いいかげんな事を書いてみます。 ・float版の sin関数、inline float __CRTDECL sin(_In_ float _X) は、float 版の sinf関数にインライン展開されている。 ・float版の sinf関数、inline float sinf(_In_ float _X) は、double版の sin関数にインライン展開されている。 って、事でしょう。 そして、double版のsin関数は、上の2つとは別に用意してある。

devman
質問者

補足

環境はVisualStudio 2010 Pro(DreamSpark)で、 VC++のWin32コンソールアプリケーションです。

関連するQ&A

  • math.hに含まれる関数が使えない

    math.hヘッダーをインクルードして、sqrt()やcos()の関数を使おうとすると、関数sqrt()は定義されていませんとエラーが出て正常にコンパイルできません。 他のヘッダー(stdio.hやstring.hやstdlib.h)の関数は正常に使えてますので、パスの設定は問題ないと思うのですが…… 解決方法はあるのでしょうか?宜しくお願いします。

  • 三角関数

    #include<math.h> を宣言していますが三角関数(sin(),cos(),tan())が使えません。これはどうしてでしょうか?

  • math.h

    C言語で以下のプログラムを打ちました #include <stdio.h> #include <math.h> main(){ printf("%f\n",sin(23.5)); } そして。下記の用に実行すると以下のようにエラーがでます。エラーからするにサイン関数が見つからない用な事いっているのですが、一体なん何んでしょう? ちなみに。OSはRed hut Linux 7.3です. % gcc -o sample sample.c /tmp/ccwod1zy.o: In function `main': /tmp/ccwod1zy.o(.text+0x17): undefined reference to `sin' collect2: ld returned 1 exit status

  • 学校の課題で

    sin,cos,tanを0~90度を出せっていわれたのですが #include <stdio.h> #include <math.h> main() { int N; float x; char *line="-------------------------------------\n"; printf(line); printf("%3s %5s %10s %13s \n", "kakudo", "sin","cos","tan"); for(N=0; N<=90; ++N) { x=N*3.14159265358979323846264338327950288/180; if(N%10==1) { printf(line); } if(N=90) { tan(N)= ; } printf("%3d %7.6f %10.6f %13.6f \n", N, sin(x), cos(x), tan(x)); } printf(line); } で出ません。 間違いは if(N=90){tan(N)= ;} の部分なのですが、どうすれば出せますか?

  • 三角関数の導関数

    いつもお世話になっています。 三角関数の導関数のところで  lim{sin(x+h) - sin(x)}/h = lim{2cos(x+h/2)sin(h/2)}/h = lim{cos(x+h/2)sin(h/2)}/(h/2) のように変形して、h→0 のとき  cos(x+h/2) → cosx  sin(h/2)/(h/2) → 1 として求めていました。 ここで質問なのですが  lim(○△) = lim○lim△ のようなことをしてもよいのでしょうか? あと h→0 のときに sinh/h → 1 となる証明は http://osaka.cool.ne.jp/economia/math/math4.pdf のページ等で図形を使うものを見つけて大体納得できたのですが、  cos(x) < sin(x)/x < 1 まできたところで、x→0 のとき cos(x)→1 とやっています。 最後のところですごく感覚的になった気がするのですが、 これは式で証明しなくてよいのでしょうか?

  • クラスは関数の寄せ集め??

    クラスという概念がいまいちわかりません。 例えばMathクラスにはmax,sin,cos,tanなどの関数がありますが、 ようはクラスって関数(メソッド)を集めたものと思います。 そのような理解であっておりますでしょうか? であるならば、わざわざクラスに分類しなくても、関数(メソッド)で良い様に思うのです。 何でわざわざnew演算子を使ってオブジェクトを作成してからでないと 関数が使えないようにしたのか、さっぱりわかりません。 関数でいいじゃないですか。と思うのです。 「キミはsin()関数を作ってね、キミはcos()関数を作ってね。」 と 「キミはMathクラスのsinメソッドを作ってね、キミはMathクラスのcosメソッド作ってね」 では意味的にはたいして違わないと思うのです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • SetPixel関数のmath.h

    WindowsXPのノートでVisualC++2008ExpressEditionを使っています。 SetPixel関数で円を描くプログラムで、math.hの問題だと思われる4つのエラーでコンパイルできません。 宣言は #include<windows.h> #include<math.h> ウィンドウプロシージャ内で switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = a - r;i <= a + r; i++) { x = i; y = (int)sqrt(pow(r, 2) - pow(x - a, 2)) + b;←96行目 SetPixel(hdc, x, y, RGB(0, 0, 0)); y = (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)' 1> 引数リスト '(int, int)' を一致させようとしているとき 同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。 どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m

  • マクローリン近似式の求め方を教えてください。

    マクローリン近似式をe,sin,cos,loge(1+x),x/(1-x)の2乗(後二者の場合絶対値が1より小さいとき)について導出し、近似値を求めよ。という問題がよくわからないので、良かったら教えてください。

  • sinのマクローリン展開

    再帰的関数定義とsin(x)のマクローリン展開の初めの10項を用いてsin(x)の近似値を出力するプログラムを作成せよ。 という問題で、マクローリン展開は分るのですがプログラムに出来ません…。 関数まで習っていて、配列などはまだ習っていないのですが、 どうやれば良いのかどなたか教えてください_| ̄|○

  • 微積分、マクローリン展開

    考え方、解き方を教えて下さい。 (1)sin (x) に n=5 としたときのマクローリンの    定理を適用せよ。 Ans. x - (1/6)x^3 + (cosθx /120)*x^5 x - (1/6)x^3 +......というところまでは分かるのですが、余剰項Rnの求め方分かりません。 f(n) (x) = ~cosθxが出てくるのですが~の部分が分かりません。 (1, 5, ....回微分の時はcos(x) 、3, 7,...回微分のときは-cos(x)) (2)sin 0.5の近似値、誤差の限界を求めよ。 近似値は当てはめるだけなのですが,誤差の限界の求め方が分かりません。

専門家に質問してみよう