- ベストアンサー
なぜかうごきません
#include<stdio.h> #include<math.h> int main() { double x; printf("%10s%10s%10s%15s%20s\n","x","log(x)","sqrt(x)","exp(x)","pow(10.0,x)"); for(x=1.0;x<10.0;x++) printf("%10.5f%10.5f%10.5f%15.5f%20.5f\n",x,log(x),sqrt(x),exp(x),pow(10.0,x)); return 0; } がどうしてもうごきません。 log,sqrt,exp,powが認識されないようです。定数なら大丈夫ですが、for文で変数を走らせると駄目になります。なぜでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
gcc使ってて-lm付けてないだけというオチの気がする(定数ならコンパイル時に畳みかけて関数呼び出ししないから)
その他の回答 (6)
- php504
- ベストアンサー率42% (926/2160)
sqrt(10) のように実行前から数値が決まっている場合はコンパイルする時点であらかじめ計算された数値が使われることが多いです コンパイル時に3.1622・・・に置き換えられて実際にはsqrt( )関数は呼ばれないためにエラーにならないのです。 sqrt(x)のように引数が変数の場合は実行時にならないと値がわからないのでそのまま関数呼び出すようにコンパイルされます。 NetBeansは使ったことがないのでわかりませんがC/C++に対応した開発環境であればリンクするライブラリを設定する項目があるはずです。 検索やマニュアル等で調べてください。
お礼
解答ありがとうございます。なんとか探してみます。
- Tacosan
- ベストアンサー率23% (3656/15482)
sqrt(10) だと動くということからすると, やはり #3 の言われるように「コンパイル時に畳み込んでいる」んでしょう. よ~するに「コンパイラが計算してる」ということ.
お礼
解答ありがとうございました、どうもそのようです。
- asuncion
- ベストアンサー率33% (2127/6289)
>undefined reference to 'pow' たぶん#3さんの回答のとおりで、数学関数ライブラリが リンクできていないためだと思います。 数学関数を使うには、math.h をインクルードしただけでは不足で、 関数の実体が入っているライブラリをコンパイル時のオプションで指定しなければなりません。
お礼
解答ありがとうございます。確かに#3さまのおっしゃるとおりでうまくいきました。 >数学関数を使うには、math.h をインクルードしただけでは不足 私もそのことについて考えたのですが、たとえばsqrt(10) などは正しい答えが返ってきます。ということはきちんとリンクされているのではないのでしょうか?
- vipasigaru
- ベストアンサー率38% (16/42)
これだけじゃちょっと・・・ コンパイラを教えてください。 ちなみに当方VS2008 Expless Editionでコンパイル&実行できました。
お礼
解答ありがとうございます。 普段はNetBeansを用いてます。 gccは4.3.2でした。
- asuncion
- ベストアンサー率33% (2127/6289)
>しかしそのコードに治してもだめでした。 ダメというのは、どんな風にダメだったのですか? 得られた結果を貼り付けてくださいますか?
お礼
解答ありがとうございます。 undefined reference to 'pow' undefined reference to 'exp' undefined reference to 'sqrt' undefined reference to 'log' となりました。
- asuncion
- ベストアンサー率33% (2127/6289)
お使いのコンパイラによっては、できるものもあります。 ただ、どのコンパイラでも同じようにできるようにするには、 int x; for(x=1;x<10;x++) { double y = x; printf("%10.5f%10.5f%10.5f%15.5f%20.5f\n",y,log(y),sqrt(y),exp(y),pow(10.0,y)); } あたりのコードを書くのが無難でありましょう。
お礼
解答ありがとうございます。 しかしそのコードに治してもだめでした。
お礼
解答ありがとうございました。 netbeansでの自動コンパイルを使っていましたが、gccで-lmつけて手動コンパイルするとうまくいきました。 >定数ならコンパイル時に畳みかけて関数呼び出ししないから 意味がわかりませんでした。よろしければもう少し詳しく教えてくれませんか?
補足
-lmが必要ということはNetBeansではコンパイルできないということでしょうか?