
C言語のプログラミングについてです。
関数f(x)=arctanxのマクローリン展開式を用いて、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;
}

No.3ベストアンサー
- 回答日時:
No1,No2の方の指摘はもっともですが、
そもそも、このマクローリン展開が成立するのは、負の数を除いて考えれば、0<=x<=1 の範囲です。
上記以外では、成立しません。
入力値を0<=x<=1に限定すれば、正しい結果が導かれています。
printf("f(x)= %.9e \n", a1);
のあとに
a2 = atan(x);
printf("arctan(x)= %.9e \n", a2);
を追加し、確認すればわかります。

No.4
- 回答日時:
>ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。
>do while文ではなく、for文とif文を使いました。
今度はうまくいったようですね。良かったです。(^^
No.2
- 回答日時:
いろいろと問題あります。
1. do {} while(?)ループの?は継続条件です。条件の書き方が違うでしょう。
2. forループは毎回10000項まで計算しているように見えます。
3. 一般にマクローリン展開はそのまま計算すると桁落ちでまともな精度がでません。
式を上手く変形して桁落ちを防ぐ必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
UTF8からUnicode(コードポイン...
-
”/”を使わずに割り算したいんで...
-
C言語で確実に論理右シフトをす...
-
16進数 加算 減算 C言語
-
VBAのINT関数について
-
EXCELの関数"STDEV(標準偏差)"...
-
float型の精度(有効桁と実数)...
-
z80について
-
2進数の足し算(C言語)
-
O(n log n)について2
-
データ型 double の桁数について
-
応用数学
-
三菱シーケンサ(Aシリーズ)で...
-
計算の丸め誤差の解消について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
ExcelでPC(パソコン)によって...
-
O(n log n)について2
-
2進数の足し算(C言語)
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
三菱シーケンサ(Aシリーズ)で...
-
VB.net Double と...
-
MATLABでの行列の全要素の和
-
除算を使わずに10で割りたい。
-
floatの有効桁数
-
”/”を使わずに割り算したいんで...
-
ExcelのINT関数の計算結果がお...
-
VBAでミリ秒まで出力する方法
-
VB6.0での小数点の扱いについて
-
Fortran において変数の定義
-
計算の丸め誤差の解消について
-
C言語について質問です。
-
CRCの計算方法について
おすすめ情報
有効桁数10桁を保証するため、do while文で行ったのですが、ほかに適した方法を見つけ出すことができました。
ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。
do while文ではなく、for文とif文を使いました。