
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- 数学 【完全微分方程式⠀】 分数で分母が0になり定義できない場合、分母を仮にtと置いてそれを極限t→0とし 1 2022/05/06 14:43
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- 数学 「f(z)=1/(z^2-1)に関して ローラン展開を使う場合、マクローリン展開を使う場合、テイラー 3 2022/08/27 19:56
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
演算について
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
C言語でセルオートマトンを作成...
-
2進数の0.2?
-
計算の丸め誤差の解消について
-
2の補数について
-
VBAでの割り算の余りの求め方
-
floatの有効桁数
-
2進数データのビット演算
-
C言語プログラミングにて、arct...
-
このC言語プログラムでどこをい...
-
EXCELの関数"STDEV(標準偏差)"...
-
2038年問題 日付算出
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
データ型 double の桁数について
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
fgetsなどのときのstdinのバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
コンピューターは指数関数をど...
-
2038年問題 日付算出
-
時刻の比較
-
2進数、16進数、10進数のことを...
-
浮動小数演算は実行環境の変化...
-
2進数の足し算(C言語)
おすすめ情報
有効桁数10桁を保証するため、do while文で行ったのですが、ほかに適した方法を見つけ出すことができました。
ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。
do while文ではなく、for文とif文を使いました。