アプリ版:「スタンプのみでお礼する」機能のリリースについて

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));

}

A 回答 (5件)

プロトタイプ宣言のない関数を呼び出すと, 「int を返す」と仮定される. さらに, 「int と double で異なるレジスタを使う」という実装では


・sin が返す値は double 用のレジスタに入っている
・printf の引数に渡す値は int 用のレジスタから取り出す
ことになり, 「sin が計算した値」とは全く関係のない値が printf に渡される可能性がある.

この回答への補足

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

補足日時:2014/02/01 14:59
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/01 16:22

/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 …

Visual Studio のプロジェクトで設定するなら「コンパイル」に「警告レベル」という項目があって、それが上記の/W<n>に相当します。

警告毎に個別に制御できますが、最初のうちは、まとめて制御する /W4 や /Wall 等で、高めに設定するとよいでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/01 16:21

あ, あとついで:



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

この回答への補足

見つかりません><

コンパイルオプションですがここに入らなかったために

http://www.eonet.ne.jp/~fhm07425/aaa.txt

にアップしました。

補足日時:2014/02/01 15:39
    • good
    • 0

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



常識的には「全部」.

この回答への補足

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

補足日時:2014/02/01 15:48
    • good
    • 0

math.hをインクルードしなかった場合も、sinやcosの計算をしています。

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

この回答への補足

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

補足日時:2014/02/01 14:42
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/01 16:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!