Метод BigDecimal.add
занимает много времени, когда один аргумент имеет большой показатель (9 цифр), а второй имеет экспонента с разной длиной. Я ждал более 5 минут, и все продолжалось.BigDecimal.add странное поведение
Вот код:
@Test
public void testAddBig() throws Exception {
MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
BigDecimal v1 = new BigDecimal("1E+100000000", mc);
BigDecimal v2 = new BigDecimal("1", mc);
System.out.println(v1.add(v2));
}
Вот часть потока отвала:
at java.math.BigInteger.square(BigInteger.java:1884)
at java.math.BigInteger.squareKaratsuba(BigInteger.java:1975)
at java.math.BigInteger.square(BigInteger.java:1888)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2011)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2006)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2012)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2010)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2006)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2012)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.squareToomCook3(BigInteger.java:2011)
at java.math.BigInteger.square(BigInteger.java:1890)
at java.math.BigInteger.pow(BigInteger.java:2263)
at java.math.BigDecimal.bigTenToThe(BigDecimal.java:3543)
at java.math.BigDecimal.bigMultiplyPowerTen(BigDecimal.java:4508)
at java.math.BigDecimal.add(BigDecimal.java:4443)
at java.math.BigDecimal.add(BigDecimal.java:1289)
Что происходит? Это ошибка?
Вы запрашиваете здесь огромное количество. На VM у меня был OutOfMemoryError из-за этого;) Просто сделайте это в калькуляторе windows;) Это даст мне мышей Invalid Imput. Это дает вам представление о длине этого числа. – AxelH
@VMN: Знаете ли вы, что означает '1E + 100000000'? – Axel
Плюс, есть этот комментарий в bigTenToThe BigInteger.pow медленный, поэтому сделайте 10 ** n, построив BigInteger из символьной строки (все еще не очень быстро) 'используя char [] размера вашего номера (не маленький ...) Поэтому не ожидайте, что сможете быстро использовать BigNumbers. – AxelH