• ベストアンサー

少数50桁以上を表示するには

BLUEPIXYの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

サンプルを作ってみました。 公式そのままなので、難しいところはないと思います。 (課題ということなので、丸写しするのではなくて、こんな感じでBigDecimalの計算をやるんだなぐらいに思って貰って、円周率を求める公式というのは、他にもいろいろあるので、そういうものやプログラムを検索して、自分でも作ってみてください。ていうか、多分削除されてしまうと思うしね。(削除されるにしても、何をどうしていいかわからん感じなので、書いてみました、このプログラムでは、収束ということを調べないで、これぐらいのループをすれば充分という感じでやってます。変更するなら、収束したかどうかでループを終了するようにしたらいいかと思います。その場合、無限ループに陥らないように、最初は、回数で制限を付けた方がいいかと思います。)) -------------------------------------------------------------------- import java.math.BigDecimal; import java.math.RoundingMode; //π/4=tan-1(1)=1-1/3+1/5-1/7+…は、収束が遅すぎる /* ガウス・ルジャンドルの公式 1.初期値 a = 1 b = 1 / sqrt( 2 ) t = 1 / 4 x = 1 2.a と b が求めようとする精度以上に十分等しくなるまで下の式を反復 y = a a = ( a + b ) / 2 b = sqrt( b ・ y ) t = t - x ・ ( y - a )^2 x = 2 ・ x 3.収束した a , b および t の値を用いて、πの値は、 π = ( a + b )^2 / ( 4 ・ t ) */ public final class Pai { static BigDecimal pai; static int scale; static { Pai.pai = Pai.pai(100);//最初に100桁分求める } private Pai(){}; static public BigDecimal sqrt(BigDecimal a, int scale){ /* sqrt(a)=x=(x^2+a)/2x */ scale*=2;//2倍精度 a=a.setScale(scale, RoundingMode.HALF_EVEN); BigDecimal x = a.divide(new BigDecimal(2), RoundingMode.HALF_EVEN); int c=(int)Math.round(Math.log(scale)/Math.log(2)); for(int i=0;i<c;i++) x=x.pow(2).add(a).divide(x.add(x),scale,RoundingMode.HALF_EVEN); return x.setScale(scale/2, RoundingMode.HALF_EVEN);//精度を戻す } static public BigDecimal pai(int scale){ if(Pai.scale==scale){ return Pai.pai; } if(Pai.scale > scale){ //要求桁数が保持してる桁数より小さい時は、単に桁数を変換して返す return pai.setScale(scale, RoundingMode.HALF_EVEN); } //要求される桁数が保持している桁数より大きいので、更新する Pai.scale=scale; scale*=2;//内部的に2倍の精度で計算する BigDecimal one = BigDecimal.ONE; BigDecimal two = new BigDecimal(2); one=one.setScale(scale); two=two.setScale(scale); BigDecimal a = one; BigDecimal b = one.divide(Pai.sqrt(two, scale), RoundingMode.HALF_EVEN); BigDecimal t = one.divide(new BigDecimal(4), RoundingMode.HALF_EVEN); BigDecimal x = one; BigDecimal y; int c=(int)Math.round(Math.log(scale)/Math.log(2)); for(int i=0;i<=c;i++){ y = a; a = a.add(b).divide(two, RoundingMode.HALF_EVEN); b = Pai.sqrt(b.multiply(y), scale); t = t.subtract(x.multiply(y.subtract(a).pow(2))); x = x.add(x); } Pai.pai=a.add(b).pow(2).divide(t.multiply(new BigDecimal(4)),scale,RoundingMode.HALF_EVEN); Pai.pai=pai.setScale(Pai.scale, RoundingMode.HALF_EVEN); return Pai.pai; } public static void main(String ar[]){ BigDecimal sqrt5 = Pai.sqrt(new BigDecimal(5),50); System.out.println(sqrt5); System.out.println(sqrt5.multiply(sqrt5)); System.out.println(Pai.pai(100)); System.out.println(Pai.pai(50)); } }

Shangrila
質問者

お礼

回答ありがとうございます。 サンプルのほうですが、コピペで試させていただきましたがRoundingModeでエラーが出てしまいます。 setScaleではなく、divideで行ってみたのですが結果は同じでした。。。

関連するQ&A

  • エクセルで小数点以下3桁を四捨五入して、小数点以下1桁を表示する方法

    エクセル2003を使用しています。 計算式から出た結果に対して、小数点以下3桁を四捨五入して、小数点以下2桁ではなく、1桁を表示したいです。 例えば、計算式の結果、 1.145 の場合、普通に四捨五入すると 小数点以下1桁なら、1.1 小数点以下2桁なら、1.15 となってしまいます。 これを小数点以下3桁を四捨五入して、小数点以下1桁表示の1.2と表示させたいのですが、可能でしょうか?

  • 少数点以下2桁以上の入力でエラーメッセージを表示するには

    データの入力規則で、少数点以下2桁以上の数値が入力されたらエラーメッセージが表示されるようにできないでしょうか? (小数点以下1桁[3.2→OK]  小数点以下2桁[3.26→エラーメッセージ]) または、条件付き書式で上記条件でセルの色を変えることはできますか? よろしくお願いします。

  • エクセルで整数表示と少数表示を混在させたい

    お世話になります。 集計用のファイルを作っています。 整数と、小数点以下1桁、2桁の数値が出てきます。 書式設定で小数点以下2桁まで表示するようにしたら、整数や小数点以下1桁の数値まで120.00とか25.50と表示されてしまい、見にくくなってしまいました。 小数点以下に0がつく場合は無視して、それぞれ120、25.5、3.25のように必要な桁数だけ表示させたいのですが、どうしたらよいでしょうか。

  • 電卓の表示(いつもは0桁、割り切れないとき2桁)

    キャノンのHS-1220TUGという電卓使ってます。 計算後の答えなんですが、割り切れないときだけ小数点2桁表示(3桁目を四捨五入)で、それ以外は0桁に表示するやり方ありませんか? いつもはFで四捨五入してるんですが、これだといつも小数点2桁まで表示されちゃうから見づらいんです。

  • 18桁の割り算をしたい

    それほど多くはないですが、今の仕事で分母が18桁、分子が16桁の分数を小数に計算をしなくてはならなくなりました。(小数点以下5桁ほど) 手持ちの計算機ではできず困っています。 何か、計算できるソフトのようなものがあれば教えて下さい。

  • DoubleからBigDecimalへの変更の仕方

    以下のソースをdouble使用箇所をBigDecimalに変更して行いたいのですが・・・ public String test( String str1, String str2){ // 計算方法: // str1 / str2 の小数点第3位切り上げ後に100掛け // 割り算を行う double d = Double.valueOf(str1).doubleValue()/Double.valueOf(str2).doubleValue(); // 掛け算を行う d = d*100; // 小数点第1位切り上げる if (d >= 10.88) { d = 11; } DecimalFormat ff = new DecimalFormat("#0.0"); return ff.format(d); }

    • ベストアンサー
    • Java
  • 1セルに6桁以上入力できない。小数点以下の表示が00になってしまう。

    エクセルの1つのセルに1,000,000と入力するも1,000となってしまいます。 数式と値をクリアにしても、表示形式を標準や数値や文字列に設定しても下3桁が入りません。 それと小数点第2位まで計算したいのに、小数点第2位は.00なってしまいます。 それと小数点以下を切り捨てで表示させたいのに、四捨五入になってしまいます。

  • Accessの桁区切りについて教えてください。

    アクセスのレポートの金額に、桁区切りのカンマを付けたいと思っています。 プロパティの書式を通貨にすると¥マークがついてしまいます。 合計は付いてもいいのですが、内訳には¥マークを付かないように桁区切りだけにしたいのです。 そのため、書式に『###,##0』としました。 できましたが、小数点以下が表示されません。 小数点を表示したいので『###,##0.###』としたら、『59,180.000』となってしまいます。 小数点の指定を自動から3桁表示に変えましたが、うまくいきません。 教えていただきたい内容としては、 ・金額の表示に桁区切りのカンマを付けたい。 ・でも¥マークは付けたくない。 ・小数点以下該当があるもののみ3桁まで表示させたいが(5,500.365)、  小数点以下がないものは小数点以下は表示させたくない(5,400)。 ぜひともアクセスを使いこなしている方、お教えください。

  • 計算する度にBigDecimalオブジェクト作成?

    javaのDouble型の足し算をするには、BigDecimalを使わなければ 正確な数値が得られない、ということで使用したのですが、 毎回、小数点の足し算をする度に、 負荷のかかるnew宣言でBigDecimalのインスタンスを作りaddメソッドで計算するというはどうも非効率に思ってしまうのです、、; javaでの小数点の足し算は皆さん通常どうやっているのでしょうか?

    • ベストアンサー
    • Java
  • テキストボックスの少数点以下表示について

    お願いします。 アクセス2002を使っています。 フォームのテキストボックスの数値表示についてお尋ねします。 たとえば「1.75」という小数点以下2桁まで表示させたいのですが、コントロールで書式を「標準」に、小数点以下表示桁数を「2」と指定しても結果は「2.00」と表示されます。 入力した1.75をそのまま1.75で表示させるにはどうすればいいのでしょうか。 宜しくお願いします。