BigDecimal.movePointRight () зависает с очень большими числами

Следующая программа зависает, и я не могу понять, почему.

import java.math.*;

public class BigDec {
  public static BigDecimal exp(double z) {
       // Find e^z = e^intPart * e^fracPart.
       return new BigDecimal(Math.E).pow((int)z, MathContext.DECIMAL128).
           multiply(new BigDecimal(Math.exp(z-(int)z)), MathContext.DECIMAL128);
   }

   public static void main(String[] args) {
       // This works OK:
       BigDecimal x = new BigDecimal(3E200);
       System.out.println("x=" + x);
       System.out.println("x.movePointRight(1)=" + x.movePointRight(1));

       // This does not:
       x = exp(123456789);
       System.out.println("x=" + x);
       System.out.println("x.movePointRight(1)=" + x.movePointRight(1)); //hangs
   }
}

Для настоящих целей первый метод просто создает очень большой BigDecimal. (Подробности: он находит e в степени z, даже если оно слишком велико, чтобы быть двойным. Я почти уверен, что этот метод верен, хотя MathContexts может быть не в лучших местах.)

Я знаю e ^ 123456789 очень большой, но я действительно хочу использовать такие числа. Любые ответы будут с благодарностью получены.

6
задан Bando Bando 13 February 2012 в 15:18
поделиться