- ベストアンサー
プログラムのおかしいところを教えてください
ライプニッツの公式により、円周率の近似値を求めるプログラムを作 成しなさい。ただし、この公式は収束が遅い。 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になってしまいます。アドバイスをお願いします
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
補足というか訂正です。 >実数と整数を使った計算をする場合は・・・ というのは正しい説明ではなかったです、申し訳無い。 「整数値と整数値を使った計算をする場合」に訂正さ せてもらいます。 n=1/i ; の右辺、1/i はどちらも、整数値です。 よって小数点以下は切り捨てになります。 小数点以下を含む計算を望む場合は、どちらかを 実数値にすればいいので。。。 n=1.0/i ; n=1/(double)i ; のどちらかにすれば良いと思います。
その他の回答 (5)
- horihorhorihori
- ベストアンサー率0% (0/1)
n=(double)1/(double)i; のようにdouble型を求めるのであればint/intではなくて double/doubleのようにすればOKです。
- shotaro777
- ベストアンサー率21% (4/19)
こんにちは。 つまらないことで支障があるかはわかりませんが、一つ気になったとこがあるので。 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; } とすればいいかと。 間違ってたらごめんなさいね。
- takaP-
- ベストアンサー率79% (83/105)
問題は、変数 i にあります。 これをint(整数型)にしてしまうと、 n=1/i; のdouble(実数型)n には右辺 1/i の小数点数 切捨て値が入る事になります。 こういった実数と整数を使った計算をする場合は 整数型の方を実数型へキャストしなければなりま せん → n=1/(double)i ; それか、i を実数型として宣言するかですね。
- imogasi
- ベストアンサー率27% (4737/17069)
もっと短くなるのじゃないでしょうか。 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]); } }
- taknt
- ベストアンサー率19% (1556/7783)
プログラムをするときに 陥りやすいのですが、 小数点などで、切捨てられる部分があるということです。 小数点を含む計算は、うまくやらないと実際の計算と合わなくなる場合があります。 上記の例だと多分、小数点以下が 四捨五入されているんじゃないのでしょうか?
補足
回答ありがとうございます どこをどうすればいいかも教えていただけるとありがたいのですが・・・
お礼
回答をしてくださったみなさんにこの場を借りてお礼を言わせていただきます。 みなさんありがとうございました double/double型にしたらできました。 やっぱりそこが悪かったみたいですね。 また、わからない事があったらそのときはよろしくお願いします