• ベストアンサー

なぜかうごきません

#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文で変数を走らせると駄目になります。なぜでしょうか?

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

  • ベストアンサー
noname#208124
noname#208124
回答No.3

gcc使ってて-lm付けてないだけというオチの気がする(定数ならコンパイル時に畳みかけて関数呼び出ししないから)

szatmari
質問者

お礼

解答ありがとうございました。 netbeansでの自動コンパイルを使っていましたが、gccで-lmつけて手動コンパイルするとうまくいきました。 >定数ならコンパイル時に畳みかけて関数呼び出ししないから 意味がわかりませんでした。よろしければもう少し詳しく教えてくれませんか?

szatmari
質問者

補足

-lmが必要ということはNetBeansではコンパイルできないということでしょうか?

その他の回答 (6)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.7

sqrt(10) のように実行前から数値が決まっている場合はコンパイルする時点であらかじめ計算された数値が使われることが多いです コンパイル時に3.1622・・・に置き換えられて実際にはsqrt( )関数は呼ばれないためにエラーにならないのです。 sqrt(x)のように引数が変数の場合は実行時にならないと値がわからないのでそのまま関数呼び出すようにコンパイルされます。 NetBeansは使ったことがないのでわかりませんがC/C++に対応した開発環境であればリンクするライブラリを設定する項目があるはずです。 検索やマニュアル等で調べてください。

szatmari
質問者

お礼

解答ありがとうございます。なんとか探してみます。

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

sqrt(10) だと動くということからすると, やはり #3 の言われるように「コンパイル時に畳み込んでいる」んでしょう. よ~するに「コンパイラが計算してる」ということ.

szatmari
質問者

お礼

解答ありがとうございました、どうもそのようです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>undefined reference to 'pow' たぶん#3さんの回答のとおりで、数学関数ライブラリが リンクできていないためだと思います。 数学関数を使うには、math.h をインクルードしただけでは不足で、 関数の実体が入っているライブラリをコンパイル時のオプションで指定しなければなりません。

szatmari
質問者

お礼

解答ありがとうございます。確かに#3さまのおっしゃるとおりでうまくいきました。 >数学関数を使うには、math.h をインクルードしただけでは不足 私もそのことについて考えたのですが、たとえばsqrt(10) などは正しい答えが返ってきます。ということはきちんとリンクされているのではないのでしょうか?

回答No.4

これだけじゃちょっと・・・ コンパイラを教えてください。 ちなみに当方VS2008 Expless Editionでコンパイル&実行できました。

szatmari
質問者

お礼

解答ありがとうございます。 普段はNetBeansを用いてます。 gccは4.3.2でした。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>しかしそのコードに治してもだめでした。 ダメというのは、どんな風にダメだったのですか? 得られた結果を貼り付けてくださいますか?

szatmari
質問者

お礼

解答ありがとうございます。 undefined reference to 'pow' undefined reference to 'exp' undefined reference to 'sqrt' undefined reference to 'log' となりました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

お使いのコンパイラによっては、できるものもあります。 ただ、どのコンパイラでも同じようにできるようにするには、 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)); } あたりのコードを書くのが無難でありましょう。

szatmari
質問者

お礼

解答ありがとうございます。 しかしそのコードに治してもだめでした。

関連するQ&A