Следующая программа зависает, и я не могу понять, почему.
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 очень большой, но я действительно хочу использовать такие числа. Любые ответы будут с благодарностью получены.