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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのINT関数の計算結果がお...
-
O(n log n)について2
-
三菱シーケンサ(Aシリーズ)で...
-
MATLABでの行列の全要素の和
-
計算機誤差
-
演算について
-
C言語で確実に論理右シフトをす...
-
c languageで 簡単な質問があ...
-
ラズベリーパイ>MM-TXS03で温度...
-
エクセルの多い桁数を表示させ...
-
長い桁(小数点以下)が計算でき...
-
z80について
-
java 実数の割り算
-
大きな桁数の計算について
-
float.h のテスト結果がおかしい
-
除算を使わずに10で割りたい。
-
fortranで図形の面積を求めるに...
-
floatの有効桁数
-
ExcelでPC(パソコン)によって...
-
スーパーコンピュータの処理速...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
VB.net Double と...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
VB6.0での小数点の扱いについて
-
”/”を使わずに割り算したいんで...
-
距離から緯度経度を求める方法
-
VBAでミリ秒まで出力する方法
-
floatの有効桁数
-
コンピューターは指数関数をど...
-
時刻の比較
-
計算の丸め誤差の解消について
-
Double型について
-
powf を使わずにべき乗を計算
おすすめ情報
有効桁数10桁を保証するため、do while文で行ったのですが、ほかに適した方法を見つけ出すことができました。
ご指摘を参考にさせていただき、今一度ソースコードを作り直してみました。
do while文ではなく、for文とif文を使いました。