EeBlog(テクニカルブログ)

第15回 天文学的な数値計算

今回は大きな数値を扱う方法について書いてみたいと思います。
Javaの基本型でサポートしている数値型は全6種類あります。
その中で整数型なら「long型」、小数なら「double型」が最も大きい数値を表すことができます。
では、この型の限界を超えてしまった場合、どうやって計算するのでしょうか?

実はJavaには大きい桁数の数値を扱うクラスが用意されています。
整数なら「java.math.BigInteger」、小数なら「java.math.BigDecimal」です。

特に小数に関してはJavaの基本型は不動小数点数のサポートしかされていないため、丸め誤差などの問題が発生します。
しかし、BigDecimalは丸め操作を制御できるので思いのまま計算が可能です。

今回のサンプルでは、先ずlong型で1に2を100回掛けるという計算をしています。
しかし、long型の最大値を超えてしまい、結果は0になります。(エラーにはなりません。)
その後、同じ計算をBigIntegerで行っています。
また、小数の計算として1を2で100回割るという計算もしています。

public class BigNum {

     public static void main(String[] args) {

         // 1に100回、2を掛けた値(オーバーフローして0になる)
         long l = 1;
         for (int i = 0; i < 100; i++) {
             l *= 2;
         }
         System.out.println(l);

         // 1に100回、2を掛けた値
        BigInteger bi = BigInteger.valueOf(1);
         for (int i = 0; i < 100; i++) {
             bi = bi.multiply(BigInteger.valueOf(2));
         }
         System.out.println(bi);

         // 1を100回、2で割った値
        BigDecimal bd = BigDecimal.valueOf(1);
         for (int i = 0; i < 100; i++) {
             bd = bd.divide(BigDecimal.valueOf(2));
         }
         System.out.println(bd);

     }

 }

オイラの財布の中身を計算するときは特殊なクラスは要りません……。