dポイントプレゼントキャンペーン実施中!

C言語のプログラミングについてです。
関数f(x)=arctan⁡xのマクローリン展開式を用いて、f(x)の値を、展開式のn項目までの計算結果と、n+1項目までの計算結果の相対誤差が10^(-10)以下になるまで(有効桁数10桁を保証するまで)試行して計算し、出力するプログラムを作成するという問題です。
次のように、展開式の項数を10000項と設定してプログラムを作成してみましたが、実行結果が-nan(ind)と出力されてしまい、有効桁数10桁での出力がされません。ソースコードのどの部分に不備があるのでしょうか?
以下ソースコードです。
#include<stdio.h>
#include<math.h>

int main(void) {
int i;
double x, a1, a2, arctan;
x = 0;
a1 = 0;
a2 = 0;
arctan = 0;

printf("f(x)=arctan x のマクローリン展開式よりf(x)の値を求める。\n");
printf("x=");
///数値xをキーボードから入力///
scanf_s("%lf", &x);

///有効桁判別ループ開始///
do {
///前値の受け渡し///
a2 = a1;

///項数の設定(10000項と設定)///
for (i = 1; i <= 10000; i++) {
///arctanのマクローリン展開式///
arctan = pow(-1, i - 1)*pow(x, 2 * i - 1) / (2 * i - 1);
a1 = a1 + arctan;
}

///相対誤差が10^-10以下になったら止める///
} while (fabs(a1 - a2) / a1 <= pow(10, -10));

///最終的な計算結果を出力///
printf("f(x)= %.9e \n", a1);

return 0;
}

質問者からの補足コメント

  • 有効桁数10桁を保証するため、do while文で行ったのですが、ほかに適した方法を見つけ出すことができました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/05/23 23:59
  • ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。
    do while文ではなく、for文とif文を使いました。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/05/24 00:01

A 回答 (4件)

No1,No2の方の指摘はもっともですが、


そもそも、このマクローリン展開が成立するのは、負の数を除いて考えれば、0<=x<=1 の範囲です。
上記以外では、成立しません。
入力値を0<=x<=1に限定すれば、正しい結果が導かれています。
printf("f(x)= %.9e \n", a1);
のあとに
a2 = atan(x);
printf("arctan(x)= %.9e \n", a2);
を追加し、確認すればわかります。
この回答への補足あり
    • good
    • 0

>ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。


>do while文ではなく、for文とif文を使いました。

今度はうまくいったようですね。良かったです。(^^
    • good
    • 0
この回答へのお礼

おかげさまで自己解決ではありますが、解決できました。ありがとうございました!

お礼日時:2017/05/25 01:28

いろいろと問題あります。


1. do {} while(?)ループの?は継続条件です。条件の書き方が違うでしょう。
2. forループは毎回10000項まで計算しているように見えます。
3. 一般にマクローリン展開はそのまま計算すると桁落ちでまともな精度がでません。
式を上手く変形して桁落ちを防ぐ必要があります。
    • good
    • 0

do ループはなんのため?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!