2013-05-17 3 views
1

Я работаю над некоторым кодом, который вычисляет точки на 2-осевом графике, и я заметил, что когда координата X или Y была равна нулю, она замедлилась. Я выплюнул некоторые отладки и обнаружил, что масштаб моего значения координаты постоянно растет. Я думал, что переход к математическому контексту приведет к тому, что возвращение большого числа людей не сможет иметь больший масштаб. Я надеялся ограничить масштаб своей точностью математического контекста. Этот код показывает, что я вижу.шкала продолжает расти за пределами математического контекста.

MathContext mc = new MathContext(32); 
BigDecimal xPos = new BigDecimal("0.0", mc); 
for (int i = 0; i < 8; i++) 
{ 
    System.out.println("" + xPos + " scale=" + xPos.scale()); 
    xPos = xPos.multiply(xPos, mc); 
} 

Шкала продолжает увеличиваться с каждой итерацией. Неужели я ошибаюсь в том, что, поскольку я перехожу к математическому контексту, чтобы он ограничивал точность возврата? Спасибо за чтение.

ответ

1

Все объяснено в документе BigDecimal API.

 
Operation  Preferred Scale of Result 

Add   max(addend.scale(), augend.scale()) 
Subtract  max(minuend.scale(), subtrahend.scale()) 
Multiply  multiplier.scale() + multiplicand.scale() 
Divide  dividend.scale() - divisor.scale() 

И это имеет смысл в логарифмическом виде.

+0

Моя ошибка заключалась в том, что передача метода MathContext для умножения привела бы результат к шкале MathContext. Но, по-видимому, он смотрит только на RoundingMode. Почему он хочет MathContext, когда он действительно хочет, чтобы RoundingMode был вне меня. После вызова multiply я вызываю setScale, передавая масштаб и режим округления, и это позволяет мне ограничить точность в моем повторном уравнении. – bittramp