第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); } }
オイラの財布の中身を計算するときは特殊なクラスは要りません……。