dポイントプレゼントキャンペーン実施中!

ライプニッツの公式により、円周率の近似値を求めるプログラムを作 成しなさい。ただし、この公式は収束が遅い。



         1     1      1     1     1      1       1    1
円周率=4(── - ── + ── - ── + ── - ──+…- ──+──)
         1    3      5      7     9     11      47    49
ってやつをJAVAでやるのですが自分で作ったのは
class en{
public static void main(String argv[]) {
int i;double n,o,p,q,r;
n=0;o=0;p=0;q=0;r=0;
for (i=1; i<=49; i=i+4) {
n=1/i;
o=o+n;
}
for (i=3; i<=47; i=i+4) {
p=1/i;
q=q+p;
}
r=4*(o-q);
System.out.println("円周率="+r);
}
}
なんですが
結果が円周率=4.0になってしまいます。アドバイスをお願いします

A 回答 (6件)

補足というか訂正です。



>実数と整数を使った計算をする場合は・・・

というのは正しい説明ではなかったです、申し訳無い。
「整数値と整数値を使った計算をする場合」に訂正さ
せてもらいます。

n=1/i ;

の右辺、1/i はどちらも、整数値です。
よって小数点以下は切り捨てになります。
小数点以下を含む計算を望む場合は、どちらかを
実数値にすればいいので。。。

n=1.0/i ;
n=1/(double)i ;

のどちらかにすれば良いと思います。
    • good
    • 0

n=(double)1/(double)i;


のようにdouble型を求めるのであればint/intではなくて
double/doubleのようにすればOKです。
    • good
    • 0
この回答へのお礼

回答をしてくださったみなさんにこの場を借りてお礼を言わせていただきます。
みなさんありがとうございました
double/double型にしたらできました。
やっぱりそこが悪かったみたいですね。
また、わからない事があったらそのときはよろしくお願いします

お礼日時:2002/11/03 23:15

こんにちは。


つまらないことで支障があるかはわかりませんが、一つ気になったとこがあるので。

double n,0,p,q,r を 0 で初期化しているようですが、0.0 にやるのが一般的です。
こうしないとまずいとか本で書いてあったような気が…たしか。

double型の答えを出すなら double/double という形にしないといけません。
上のやり方だとそれになってないようなので。
例えば上の for の部分を

for (double i = 0.0; i < 49.0; i+=4.0) {
o += 1.0 / i;
}
for (i = 3.0; i < 47.0; i+=4.0) {
q += 1.0 / i;
}

とすればいいかと。
間違ってたらごめんなさいね。
    • good
    • 0

問題は、変数 i にあります。


これをint(整数型)にしてしまうと、

n=1/i;

のdouble(実数型)n には右辺 1/i の小数点数
切捨て値が入る事になります。
こういった実数と整数を使った計算をする場合は
整数型の方を実数型へキャストしなければなりま
せん → n=1/(double)i ;
それか、i を実数型として宣言するかですね。
    • good
    • 0

もっと短くなるのじゃないでしょうか。


VBAでやりましたが、JAVAに置換えました。
Sub test01()
Dim p(101)
p(1) = 1
For n = 2 To 100
p(n) = p(n - 1) + ((-1) ^ (n - 1)) / (2 * n - 1)
Cells(n, 1) = p(n)
Next n
Cells(n, 1) = 4 * p(n - 1)
End Sub
3.131592904になりました。
<Java>
class en1{
public static void main(String args[]) {
int n;
double p[];
p=new double[101];
p[1] = 1;
for(n = 2;n<101;n=n+1){
p[n] = p[n - 1] + Math.pow((-1) , (n - 1)) / (2 * n - 1);
System.out.println(p[n]);
}
System.out.println("円周率="+ 4.0 * p[n - 1]);
}
}
    • good
    • 0

プログラムをするときに 陥りやすいのですが、


小数点などで、切捨てられる部分があるということです。
小数点を含む計算は、うまくやらないと実際の計算と合わなくなる場合があります。

上記の例だと多分、小数点以下が 四捨五入されているんじゃないのでしょうか?

この回答への補足

回答ありがとうございます
どこをどうすればいいかも教えていただけるとありがたいのですが・・・

補足日時:2002/11/03 13:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!