C言語初心者です。
自分で作ったプログラムのソースはhttp://www1.axfc.net/uploader/He/so/375902.txtにあります。
(1)は一応解けたと思うのですが、(2)に関してはお手上げでした。
<問題>
π = 4*(π/4) = 4*arctan(1)
arctan(x) のテイラー展開を用いてπの値を正しく求めよ。(最低7桁まで)
(1)単精度・倍精度で誤差を比較せよ。
(2)単精度のみを用いて正しく求めよ。
(2)のやり方を教えてください。
(1)も上手くいったとは言い難いので、気づいた点があればご指摘願います。
No.2ベストアンサー
- 回答日時:
#1の続きです
級数の値を求めるとき、値の小さい項を先に足しこむほうが正確に求められます
プログラムを作って確かめてみました
#include <iostream>
#include <iomanip>
int main(void) {
int n=10000;
float p4a=0.0f;
for (int i=n-3; i>0; i-=4) p4a+=2.0f/i/(i+2);
float pa=4.0f*p4a;
std::cout << std::setprecision(20)<<pa<<"\n";
float p4b=0.0f;
for ( int i=n-1; i>0; i-=4 ) p4b+=2.0f/i/(i+2);
float pb=4.0f*(1.0f-p4b);
std::cout << std::setprecision(20)<<pb<<"\n";
float pc=(pa+pb)/2;
std::cout << std::setprecision(20)<<pc<<"\n";
}
結果
3.141392707824707
3.1417925357818604
3.1415925025939941
7桁目まで求められました
「Euler変換」が交代級数の値を求めるときの参考になるでしょう
(1)に引き続きのお礼欄です。
std::cout << std::setprecision(20)<<pa<<"\n";のみよくわかりませんでしたが、printfみたいなものですよね。
他はわかった気がしますが、見慣れない書き方もあって未熟さを実感しつつも勉強になりました。
足す順によって結果が変わること、ご回答のように今回の場合は平均をとることで精度が上がることも勉強になりました。精進いたします。
回答ホントにありがとうございました。
No.1
- 回答日時:
> (1)も上手くいったとは言い難いので、気づいた点があればご指摘願います。
xの値は1.0なので、
double f_double(void){
double z;
int n;
z = 0;
for(n=1;n<pow(10,7);n+=2){
if(n%4 == 1){
z = z + 1.0/n;
}
else{
z = z - 1.0/n;
}
}
return z;
}
にする。
> (2)のやり方を教えてください。
交代級数(項ごとに符号が変わる級数)をそのまま計算すると誤差が大きくなるので、たとえば、
a(n)=1.0/n-1.0/(n+2)=2.0/(n*(n+2))
を、(1):n=1から4おきに加えるか、
(2):n=3から4おきに加えたものを1.0から引くか、
あるいは、(3):(1)と(2)の平均値をとる
ことで精度を上げることができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C++】ヘッダ内でstringを格納...
-
空ENTERの判別
-
cygwinでのboost
-
C++でShowCursorを使いたい。
-
vectorのイテレータを大小比較...
-
gccでコンパイル時のエラー
-
VS2019でofstreamが未定義になる
-
string型のフォーマット書式指...
-
c++のvirtual関数および継承に...
-
STLのwstring型から BSTR型 へ...
-
wstringの主力
-
string型の固定長文字列を配列...
-
コンパイルエラー
-
構造体に決められた文字列を入...
-
C++ 平均値、最大値と最小値の...
-
#include "fstream.h"
-
C言語のポインターで詰まっている
-
構文エラーが出ているのですが...
-
2重の(?)の#include
-
C++ iteator const を使ったプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
#defineの使い方について
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
enumの値から定義名を文字列化...
-
C++での <iostream.h>と<iostre...
-
VS2019でofstreamが未定義になる
-
std::wstringのメモリリークに...
-
wstringの主力
-
JPEGやPNGが読めるLoadImage関数
-
なぜ、C++の標準ヘッダをインク...
-
#include "fstream.h"
-
C言語のエラーを修正したい
-
C言語のポインターで詰まっている
-
#define中の#のエスケープ
-
リモートデスクトップの接続元I...
-
CStringとString
-
【C++】複素数で配列を使いたい
おすすめ情報