• ベストアンサー

C言語にてsin,cosは何?

C言語でsin、cosを計算したところ、答えが違っていました。 netで探したところ<math.h>をincludeしていないせいだとわかったのですが、 <math.h>を指定しなかったら何を計算しているんでしょうか? Visual Studio 2013 win7 #include<stdio.h> #include <math.h> int main(void){ printf("結果=%f\n",sin(0.5)); }

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

プロトタイプ宣言のない関数を呼び出すと, 「int を返す」と仮定される. さらに, 「int と double で異なるレジスタを使う」という実装では ・sin が返す値は double 用のレジスタに入っている ・printf の引数に渡す値は int 用のレジスタから取り出す ことになり, 「sin が計算した値」とは全く関係のない値が printf に渡される可能性がある.

maiko0318
質問者

お礼

ありがとうございました。

maiko0318
質問者

補足

そういった、宣言しないと意図しない結果になるヘッダーは他に何がありますか? 全て上げていただけるとありがたいです。こんなことで悩むのは嫌ですから。 (エラーになるものは調べるきっかけがあるので省略してください。)

その他の回答 (4)

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

/w 警告をすべて無効にする /wd<n> 警告 n を無効にする /we<n> 警告 n をエラーとして扱う /wo<n> 警告 n を 1 度だけ表示する /w<l><n> n の警告レベル 1-4 を設定する /W<n> 警告レベルを設定する (既定 n=1) /Wall 警告をすべて有効にする /WL 1 行診断を有効にする /WX 警告をエラーとして扱う このあたりが、警告関係。 詳細はマニュアルを参考に。 http://msdn.microsoft.com/ja-jp/library/thxezb7y%28v=vs.90%29.aspx Visual Studio のプロジェクトで設定するなら「コンパイル」に「警告レベル」という項目があって、それが上記の/W<n>に相当します。 警告毎に個別に制御できますが、最初のうちは、まとめて制御する /W4 や /Wall 等で、高めに設定するとよいでしょう。

maiko0318
質問者

お礼

ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あ, あとついで: たぶん「未宣言の関数に対して警告を出す」オプションはあると思うから, それを *常に* 設定しておくといい.

maiko0318
質問者

補足

見つかりません>< コンパイルオプションですがここに入らなかったために http://www.eonet.ne.jp/~fhm07425/aaa.txt にアップしました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

理屈からいえば「int 以外の値を返す関数を宣言している」すべてのヘッダ. 常識的には「全部」.

maiko0318
質問者

補足

「全部」をリストにあげてもらえませんか?

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

math.hをインクルードしなかった場合も、sinやcosの計算をしています。ただ、その結果の解釈方法が変わってしまうのです。 math.hにはsin()やcos()は「double型を返す」と宣言されています。C言語では、型の宣言がされていない関数は暗黙的にint型を返すものと見なすことになっているので、math.hをインクルードしないと結果の型を誤解してしまいます。

maiko0318
質問者

お礼

ありがとうございました。

maiko0318
質問者

補足

そういった、宣言しないと意図しない結果になるヘッダーは他に何がありますか? 全て上げていただけるとありがたいです。こんなことで悩むのは嫌ですから。 (エラーになるものは調べるきっかけがあるので省略してください。)

関連するQ&A