Порядок величины BigDecimal

Я пытаюсь измерить точность вычисленного результата (как двойного) по сравнению с BigDecimal с известным правильным результатом с произвольной точностью. Я хочу убедиться, что это правильно до x знаков после запятой. Я полагаю, что это можно сделать так:

(порядок правильного результата) - (порядок разницы) > x

У меня возникли проблемы с поиском простого способа вычислить порядок величины BigDecimal. Любые идеи?

Если это плохой способ измерения точности, я был бы открыт для других методов.


person Bridger Maxwell    schedule 24.06.2011    source источник


Ответы (2)


Чтобы проверить количество правильных знаков после запятой, вам просто нужен порядок величины разницы, а не порядок величины правильного результата. Итак, я полагаю, вам нужно преобразовать вычисленный результат double в BigDecimal, вычесть точный результат, затем преобразовать обратно в double и взять логарифм по основанию 10.

Или, если вам просто нужно проверить, является ли результат точным до x знаков после запятой, просто проверьте, превышает ли разница 0,5 * 10 ^ (-x) или эквивалентно:

int x = 3; // number of decimal places required
BigDecimal difference = accurateResult.subtract(new BigDecimal(approxResult));
BigDecimal testStat = difference.movePointRight(x).abs();
boolean ok = testStat.compareTo(new BigDecimal(0.5)) <= 0;

На самом деле это, вероятно, не совсем правильно, в зависимости от того, что именно вы подразумеваете под «исправить до x знаков после запятой» и насколько строгим вы должны быть. Вы могли бы сказать, что 0,15001 и 0,24999 равны 1 знаку после запятой (оба округляются до 0,2), но 0,19999 и 0,25001 не равны, хотя разница меньше. Если вы пойдете по этому пути, я думаю, вам просто нужно явно округлить оба числа до x знаков после запятой, а затем сравнить.

person Ben    schedule 24.06.2011

Поскольку вас, кажется, интересует только приблизительная оценка: вы должны сравнить log_10 обоих значений, что говорит вам о порядке величины вашей ошибки... Вы можете получить хорошее приближение log_10 BigInteger, посмотрев на длину его десятичного представления toString(10).length()

person dcn    schedule 24.06.2011