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

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

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

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

Q&A

解決済

1回答

690閲覧

再帰を利用したexpのn次近似

aufheben

総合スコア24

C

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

0グッド

0クリップ

投稿2018/01/23 22:17

##再帰呼び出しを利用してexpのn次近似を得たいです。

lang

1#include <stdio.h> 2#include <math.h> 3double myexp(int, int); 4double divx(int, int); 5 6int main() { 7 int x; 8 int n; 9 double ex; 10 11 printf("xを入力して下さい "); 12 scanf("%d", &x); 13 printf("次数nを入力して下さい "); 14 scanf("%d", &n); 15 16 ex= myexp(x, n); 17 printf("\nexp(%d,%d) =\t%20.15f\n", x, n, ex); 18 printf("exp(%d) =\t%20.15f\n", x, exp(x)); 19 return 0; 20} 21 22double myexp(int x, int n) { 23 double e; 24 if (n == 0)e = 1; 25 else { 26 e = divx(x, n) + myexp(x, n - 1); 27 printf("depth(%3d) : exp(%d) = %20.15f\n", n, x, e); 28 } 29 return e; 30} 31 32double divx(int x, int n) { 33 double e; 34 if (n == 0) return 1; 35 else { 36 e = x / n * divx(x, n - 1); 37 } 38 return e; 39} 40

関数divxが(x^n)/n!を表しています。
関数myexpは項の和です。

###得たい結果

lang

1xを入力して下さい 5 2次数nを入力して下さい 25 3depth( 0) : exp(5) = 1.000000000000000 4depth( 1) : exp(5) = 6.000000000000000 5depth( 2) : exp(5) = 18.500000000000000 6 ... 7depth( 24) : exp(5) = 148.413159078836657 8depth( 25) : exp(5) = 148.413159098050073 9 10exp(5,25) = 148.413159098050073 11exp(5) = 148.413159102576600

###得られた結果

lang

1xを入力して下さい 5 2次数nを入力して下さい 10 3depth( 1) : exp(5) = 6.000000000000000 4depth( 2) : exp(5) = 16.000000000000000 5depth( 3) : exp(5) = 26.000000000000000 6depth( 4) : exp(5) = 36.000000000000000 7depth( 5) : exp(5) = 46.000000000000000 8depth( 6) : exp(5) = 46.000000000000000 9depth( 7) : exp(5) = 46.000000000000000 10depth( 8) : exp(5) = 46.000000000000000 11depth( 9) : exp(5) = 46.000000000000000 12depth( 10) : exp(5) = 46.000000000000000 13 14exp(5,10) = 46.000000000000000 15exp(5) = 148.413159102576600

見やすさとスペースの関係上得られた結果を10で打ち切っていますが、n=25の時も5行目以降は全て46.000で最後の結果も変わりませんでした。

自分なりにいろいろ考えてみたのですが思いつかなかったので、得意な方いらっしゃったら回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

改善するのかわからないのですが、e = x / n * divx(x, n - 1);で、式が左結合で演算されるのに対してxnは両方intなので、ここが整数除算になってしまっています。

e = (double)x / n * divx(x, n - 1);のように浮動小数点演算に持ち込んでみるとどうなるでしょうか。

投稿2018/01/23 22:32

maisumakun

総合スコア145183

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

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

aufheben

2018/01/23 23:30

初歩的なミスなのに気づきませんでした。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問