ここから本文です

C言語でプログラムを書いています exp(x) の値を、xマクローリン展開を用いて第...

uch********さん

2017/6/2113:15:46

C言語でプログラムを書いています

exp(x) の値を、xマクローリン展開を用いて第20項まで求め
それらを足し合わせたもの出力するプログラムを作成したいです

((x^n)/n!において、nがそれぞれ0~19までのときの数値を足し合わせたもの)

方針としては、マクローリン展開した第i項を配列a[i]に格納して
それを足すことで求めようとしたのですが、コンパイルができません

エラーメッセージはundefined reference to `pow'
powの参照が未定義です、と表示されています

間違っている箇所を教えていただきたいです(´・ω・`)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<作成したプログラム>

#include<stdio.h>
#include<math.h>

int MaclaurinExp(float x);

int main(void)
{
float x;

printf("exp(x) 求めたいxの値を入力してください:"); /*xの値の入力*/
scanf("%f",&x);

printf("exp(%f)=%f \n",x,MaclaurinExp(x)); /*結果の出力*/

return 0;
}

int MaclaurinExp(float x)
{
int i,j,k; /*ループカウンタi,jを定義*/
float e; /*xの階乗k,マクローリン展開した結果e定義*/
float a[20]; /*マクローリン展開した第i項を格納する配列*/

for(j=1; j<=x; j++) /*xの階乗を求める*/
{
k=k*j;
}

for(i=1; i<20; i++) /*第20項までマクローリン展開*/
{
a[i]=pow(x,i)/k; /*マクローリン展開した第i項*/
e +=a[i];
}
return e; /*戻り値をeとする*/
}

補足今回は、画像や具体的な値を用いて、よりわかりやすく回答していただいた
nora1962jpさんをベストアンサーとしました
ありがとうございました

kondowahさんも、早くに回答していただき、ありがとうございました
回答をいただくまで、コンパイルの時にオプションをつけ忘れていることに
気がつきませんでした。とても助かりました

またC言語の質問などをすることがあるかと思いますので
また見かけた際には、どうかよろしくお願いいたします(^^)

閲覧数:
460
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2017/6/2118:02:40

参考までにRuby、Pythonの組込モジュール使うと
exp(4)はどちらも
54.598150033144236

出来るだけ近づけようとする場合の考え方として小さな数の方から足し込むというのがあります。
floarで20項までの場合は顕著でないかもしれませんがdoubleで近似値に近づけたい時は考慮に入れておいたほうがいいです。

#include <stdio.h>
#include <math.h>

#define N 50

double MaclaurinExp(double x);

int main(void)
{
double x;

printf("exp(x) 求めたいxの値を入力してください:"); /*xの値の入力*/
scanf("%lf",&x);

printf("exp(%f)=%20.16f\n",x,MaclaurinExp(x)); /*結果の出力*/

return 0;
}

double MaclaurinExp(double x)
{
int i;
double a[N];
double e = 0.0;
a[0] = 1.0;
for(i=1; i<N; i++){
a[i] = a[i-1] * i;
}
for(i=N-1; i>=0; i--){
e += pow(x, (double)i) / a[i];
}
return e; /*戻り値をeとする*/
}

参考までにRuby、Pythonの組込モジュール使うと
exp(4)はどちらも...

ベストアンサー以外の回答

1〜1件/1件中

kon********さん

2017/6/2114:37:58

MaclaurinExp関数を以下のように
直しました。
int MaclaurinExp→float MaclaurinExp
本文のほうも
e=0.0;
a[0]=1.0;
for(i=1;i<20;i++){
a[i]=a[i-1]/i;
}
for(i=0; i<20; i++) /*第20項までマクローリン展開*/
{
a[i]*=pow(x,i); /*マクローリン展開した第i項*/
e +=a[i];
}
return e; /*戻り値をeとする*/

として
Visual sutdio 2017のC++コンパイラでは
cl q11175675911.c
MSYS2環境でのgccでは
gcc q11175675911.c
ちょっと古いLinux環境では
gcc q11175675911.c -lm

でコンパイルができました。
動かしてみたところまぁそれらしき数値
が出力されるようです。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる