関数でarctan1やpiを求めるプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
qetuo

関数でarctan1やpiを求めるプログラム

#1

投稿記事 by qetuo » 5年前

下記のプログラムの実行結果が、例えば101と入力すると”101まで計算した場合の pi の値: 0.000000”となり、piの値が正しく出力されません。様々な入力を試したところ、恐らくどのような入力値でもpiの値が0となってしまうようです。原因を見つけることができないので教えてください。

このプログラムでやりたいことを説明します。
大まかにいうと、pi=4*arctan1であるのでarctan1の値を関数により求め、piの値を出力したいです。その際、整級数展開のどのべき乗の項まで計算するかをキーボードからの入力で指定します。
プログラムに沿って細かく説明します。main関数では出入力のみ行います。arctan1=1 - 1/3 + 1/5 - 1/7 + ... であるので、hugou関数で各項の符号を求めます。それを利用してarctan関数でarctan1の値を求め、最後にmain関数でarctan1を4倍して出力しています。

math.hをincludeしてatanを使うという方法は使わずにお願いします。
入力された値の適切不適切の確認は省いています。

コード:

#include <stdio.h>

int hugou(int);
double arctan(int);

int main() {
  int n;
  printf( "級数の計算上限となる数を奇数で入力して下さい: " );
  scanf( "%d" , &n );
  printf( "%dまで計算した場合の pi の値: %.6f \n" , n, 4*arctan(n) );
  return 0;
}

int hugou(int x) {
  int i, _hugou=-1;
  for ( i=1; i<=x; i++ ) _hugou *= -1;
  return _hugou;
}
double arctan(int y) {
  int i, tan1=0;
  for ( i=1; i<=((y+1)/2); i++ ) tan1 += (double)hugou(i)/( 1 + 2*(i-1) );
  return tan1;
}


box
記事: 2002
登録日時: 13年前

Re: 関数でarctan1やpiを求めるプログラム

#2

投稿記事 by box » 5年前

arctan関数において、戻り値を格納する変数tan1の型がどうしてintなんですか?
ここは普通doubleにするでしょう。それから、細かい話をすると

コード:

  for ( i=1; i<=x; i++ ) _hugou *= -1;
-1と1を交互に「計算して」いるのは何だかムダだと思いませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 関数でarctan1やpiを求めるプログラム

#3

投稿記事 by box » 5年前

コード:

#include <stdio.h>

double arctan(int n)
{
    int i, t;
    double sum;

    for (sum = 0, i = 1; i <= n; i++) {
        t = 2 * i - 1;
        sum += 1.0 / ((i % 2 == 0) ? -t : t);
    }
    return sum;
}

int main(void)
{
    int n;

    printf("何項めまで計算しますか?(正の整数):"), scanf("%d", &n);
    printf("π=%f\n", 4 * arctan(n));
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

qetuo

Re: 関数でarctan1やpiを求めるプログラム

#4

投稿記事 by qetuo » 5年前

box さんが書きました:
5年前
arctan関数において、戻り値を格納する変数tan1の型がどうしてintなんですか?
ここは普通doubleにするでしょう。それから、細かい話をすると

コード:

  for ( i=1; i<=x; i++ ) _hugou *= -1;
-1と1を交互に「計算して」いるのは何だかムダだと思いませんか?
doubleにしたらきちんとした値が出ました。単なるミスでした。

確かに無駄でしたね。修正します。

返信ありがとうございました。

かずま

Re: 関数でarctan1やpiを求めるプログラム

#5

投稿記事 by かずま » 5年前

qetuo さんが書きました:
5年前
doubleにしたらきちんとした値が出ました。
tan1 を double にしても、n = 101 の場合 3.161199 ですよね。
きちんとした値かなあ。

もっと収束の速いものを紹介しましょう。

コード:

#include <stdio.h>

double arctan(int);

int main(void)
{
	int n;
	printf("級数の計算上限となる数を奇数で入力して下さい: ");
	scanf("%d", &n);
	printf("%dまで計算した場合の pi の値: %.10f\n", n, 4*arctan(n));
	return 0;
}

double arctan(int n)
{
	double a = 0, t = 1.5 / 1.732050807568877, c = -1.0 / 3;
	for (int i = 1; i < n; i += 2) a += t / i, t *= c;
	return a;
}
小数点以下6桁なら、n = 25 で OK です。
1.732050807568877 は √3です。

返信

“C言語何でも質問掲示板” へ戻る