質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

7537閲覧

マクローリン展開でeの値を求めたい

forza

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/02/06 11:55

編集2019/02/06 12:22

マクローリン展開を用いてeの値であるe=2.718...を求めたいのですが以下のプログラムではNの値をどれだけ変化させてもe=2.718と出てきません。
どのように修正する必要があるのでしょうか?
ご回答宜しくお願いします。

#include <stdio.h> #include <math.h> #define N 5 double k(int x) { int i,k=1,l=1; for(i=0;i<x;i++){ k=k*l; l=l-1; } return k; } double myexp(double x,int n) { int i=1; double y; double e; e=1; y=pow(x,i); for(i=1;i<N;i++){ e=e+(y/(k(i))); } return e; } int main(void) { double e; e=myexp(1,N); printf("e=%.10f\n",e); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/02/06 12:06

pow(x,i); や k=k*l; など初期化されていない変数を計算で使用していますが、その場合の計算結果は動作未定義です。(つまり、やってはいけない) 初期化されていない変数が使われているというのがおかしいと思うので、そこをまず直してみてはどうでしょうか
forza

2019/02/06 12:25

ご指摘有難う御座います。 1で初期化してみましたところN =3においてe=2.0 、N=5においてinfとなりました。 1での初期化が誤っているのでしょうか。
guest

回答4

0

初期化されていない変数があります。

double k(int x)

int i, k, l;

double myexp(double x,int n)

int i;

何を入れるのが正しいのでしょうか?

投稿2019/02/06 12:08

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

forza

2019/02/06 12:28

ご回答及びご指摘有難う御座います。 それぞれ1を代入して見たのですが正しいでしょうか。
guest

0

ベストアンサー

先程のニュートン法に関する質問でもそうですが、まず数式で確認してから、コードに落とし込むとよいかと思います。

イメージ説明

数式を見ると、for 文の中で x^k / k! を足していけばよいとわかりますね。
(0! = 1, x^0 = 1 に注意)

修正案

cpp

1#include <math.h> 2#include <stdio.h> 3#define N 20 4 5/** 6 @brief k! を計算する。 7 */ 8double factorial(int k) 9{ 10 // 1 * 2 * ... * k を計算する。 11 int ret = 1; 12 for (int i = 1; i <= k; ++i) 13 ret *= i; 14 15 return ret; 16} 17 18/** 19 @brief e^x を n 項までマクローリン展開した値を返す。 20 */ 21double myexp(double x, int n) 22{ 23 double e = 0; 24 for (int k = 0; k < N; ++k) 25 e += pow(x, k) / factorial(k); // x^k / k! 26 27 return e; 28} 29 30int main(void) 31{ 32 double e = myexp(1, N); 33 printf("e=%.10lf\n", e); // e=2.7182818351 34} 35

投稿2019/02/06 12:24

編集2019/02/06 12:27
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

forza

2019/02/06 12:35

いつもご回答して頂きまして有難う御座います。 数式をよく理解していない状態で更に理解していないプログラミングを書く事は早計でした。 お陰様でこの度も勉強させて頂きました。なるべく1人で解決できるように努めます。 有難う御座いました。
guest

0

いろいろ、未代入の変数を使っています。myexpの引数のnも使ってないし。
この変数を何に使うかが途中で忘れちゃうんでしょうかね。
よく考え直しましょう。変数の意味を紙に書いては?

投稿2019/02/06 12:15

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

forza

2019/02/06 12:26

ご回答及びご指摘有難う御座います。 一度初期化も含めて初めから見直してみたく思います。
guest

0

他の方々も仰っておられるように変数の初期化がなされていないのが原因ですね。

それはさておき、階乗関数kを次のように修正してはいかがでしょうか?(変数kと混同するので関数名をfactorialと改めました。)

c

1double factorial(int x) 2{ 3 int i,k; 4 5 k = 1; 6 for(i=1;i<=x;i++){ 7 k *= i; 8 } 9 return k; 10}

それとe = 1;ではなくe = 0;とする必要もあります。

投稿2019/02/06 12:14

編集2019/02/06 12:21
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

forza

2019/02/06 12:29

ご回答有難う御座います。 参考にさせて頂きましてe=0として考え直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問