- ベストアンサー
double型で収まりきれない小数の値を求めたい。
下記のようなプログラムを作っています。 int num = 1000; double d1 = 12345.6; double d2 = 0.0: for(int i=0;i<num;i++){ d2 += Math.pow(d1,(double)i); } d2の値を求めたいのですが、これをこのまま実行すると、得られる数値が大きすぎてd2の値がInfinityになってしまいます。 小数を格納できる最大の型はdouble型ですよね? それに収まりきらないということは、私の求めたい数値はJavaでは求めることが出来ないのでしょうか? それとも何かInfinityになってしまうのを回避する手段はあるのでしょうか? d2で得られた値はそのまま他の計算式で利用するのでどうしてもすべて小数値でなくてはならないのです。 どなたかお知恵をお貸しください。 よろしくお願いします!!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
加減乗除などの基本的な演算しか使えませんが、java.math.BigDecimalというクラスを使うと、どんな大きな/小さな小数も扱えます。 また、java.math.BigIntegerクラスでは、どんな大きな整数も扱えます。こちらは、累乗や余りの計算など、BigDecimalより多少多くの機能があります。 ところで、1番目の型がおっしゃる long double という数値型は、Javaにはありません。プリミティブ値では double が限界です。
その他の回答 (2)
- -soh-
- ベストアンサー率27% (55/201)
プリミティブ型の限界値を越しているのは確かなんでしょうね。 私が限界値を突破してしまう数値計算をしなければならないとき取った方法を一応書きますと 数値をString型に格納するようにしました。 そいでString型渡しで四則演算できる関数を用意して (中では一桁ずつプリミティブ型に収まりきる程度の値に分割して、少しずつ計算して答えを他のStringに格納、これ繰り返して最後にまた少しずつ答えを足していきました) 越えてしまう数字を計算する。 って方法でやりくりましたよ。 速度は言うまでもなく遅いですけどね(--; それでは(^-^/~~
お礼
String型の利用ですか~。 私も少し考えたんですが、やはりその方法でも何とかコーディングできたんですね。 ただ道のりがかなり長そうですが・・・(^^; 今回は整数部分をlong、小数部分をdoubleに別々に格納することによって何とか対処することができました。 -sou-さんのご意見も、大変参考になりました。 ありがとうございました!
- asuca
- ベストアンサー率47% (11786/24626)
使っているCによりますが、 long doubleは使えませんか?
お礼
今回は整数部分と小数部分を分けて格納することによって何とか対処しました。 ありがとうございました! もしかしたらなんですが、long doubleってC言語ですよね?(笑)
補足
Cってなんですか?すみません(^^;; long doubleというと、d2の整数部分と小数部分に分けて格納する、と意味でしょうか?
お礼
やはりBigDecimalクラスですか! この質問を書き込む前にJava関連のHPを探したところ、そのクラスのことが少しだけ書いてあったのですが、今まで使ったことがないもので利用方法が分からず断念してしまいました。 今回は整数部分をlong、小数部分をdoubleに別々に格納することによって何とか対処することができました。 今後のためにも、これからBigDecimalクラスの利用法の学習をしたいと思います。 ありがとうございました! あと余談なんですが、一番目の方がおっしゃってたのはもしかしてC言語だったのでしょうか?(笑)