Насколько точен / точен java.lang.Math.pow (x, n) для больших n? - PullRequest
2 голосов
/ 06 апреля 2011

Я хотел бы рассчитать (1.0-p)^n, где p - это двойное число от 0 до 1 (часто очень близкое к 0), а n - положительное целое число, которое может быть порядка сотен или тысяч (возможно, больше; я пока не уверен). Если возможно, я хотел бы просто использовать для этого встроенную в Java java.lang.Math.pow(1.0-p, n), но я немного обеспокоен тем, что при этом может произойти гигантская потеря точности / точности с диапазоном значений, которые меня интересуют. У кого-нибудь есть приблизительное представление о том, какую ошибку я мог бы ожидать, используя реализацию Java? Я не уверен, что скрывается под их реализацией (журналы и / или приближения Тейлора?), Так что я не могу рисковать догадками.

Меня больше всего беспокоит относительная ошибка (т. Е. Не отключение более чем на порядок). Если ответом окажется то, что реализация Java приведет к слишком большому количеству ошибок, есть ли у вас хорошие рекомендации по библиотекам (но, опять же, я надеюсь, что в этом нет необходимости)? Спасибо.

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

Согласно API doc:

Расчетный результат должен быть в пределах 1 ульт от точного результата.

Так что я неЯ думаю, что вам нужно беспокоиться о реализации столько же, сколько об ограничениях точности с плавающей точкой.Возможно, вы захотите использовать BigDecimal.pow(), если ваша первостепенная задача - точность, а не производительность.

0 голосов
/ 06 апреля 2011

Некоторые эмпирические результаты:

public static void main(String[] args)
{
    double e = 0.000000000001d;
    System.out.println(Math.pow(1-e, 1.0d/e));
    float f =  0.000001f;
    System.out.println(Math.pow(1-f, 1.0f/f));
}

0.36788757938730976
0.3630264891374932

Оба должны сходиться к 1 / e (0,36787944 ....), поэтому очевидно, что о float не может быть и речи, но для double может быть достаточно точности для вас.

0 голосов
/ 06 апреля 2011

Вы можете взглянуть на исходный файл класса java.land.Math и посмотреть, сможете ли вы понять точный метод. Вот ссылка, http://www.docjar.com/html/api/java/lang/Math.java.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...