以下程序冻结,我无法弄清楚原因。
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。 (细节:它找到了z的力量,即使它太大而不是双倍。我很确定这种方法是正确的,尽管MathContexts可能不是最好的地方。)
我知道e ^ 123456789非常大,但我确实想要使用这样的数字。非常感谢任何答案。
答案 0 :(得分:4)
实际上它并没有冻结,但Oracle VM中movePointRight
的实现效率极低。使用10的幂乘以或除以而不是使用movePointRight
或movePointLeft
方法通常要快得多。在您的情况下,使用x.multiply(BigDecimal.TEN)
可能会更好。