Используя логарифм вместо деления для больших чисел? - PullRequest
0 голосов
/ 20 февраля 2011

Я не мог придумать правильное название для моего вопроса, но позволил мне представить мой случай;Я хочу рассчитать коэффициент значимости в форме: p = 1 - X / Y

Здесь X происходит из итеративного процесса;процесс выполняет большое количество шагов и подсчитывает, сколько разных способов может завершиться процессом в разных состояниях (хранится в HashMap).После завершения итерации я выбираю несколько состояний и суммирую их значения.Трудно сказать, насколько велики эти числа, поэтому я собираюсь ввести сумму как BigInteger.

Y , с другой стороны, получается из биномиального коэффициента с числами в тысячах.масштаб.Я склонен использовать logGamma для расчета этих коэффициентов, что в результате дает мне натуральный логарифм значения.

Меня интересует, как сделать деление X / Y наилучшим / наиболее эффективным способом.Если бы я мог получить X в натуральном логарифме, то я мог бы вычесть силы и получить мой результат как 1 - e ^ (lnX - lnY).

Я вижу, что BigInteger нельзя логарифмировать с помощью Math.log, что я могу сделать в этом случае?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Вы можете использовать двойники. Дабл может быть очень большим, около 1.7e308. Чего не хватает, так это точности: он поддерживает только около 15 цифр. Но если вы можете жить с 15-значной точностью (другими словами, если вас не волнует разница между 1 000 000 000 000 000 и 1 000 000 000 000 001), то двойные значения могут приблизить вас достаточно близко.

2 голосов
/ 20 февраля 2011

Если вы вычисляете биномиальные коэффициенты для чисел в тысячах, то Double s не будет достаточно хорошим.

Вместо этого я был бы склонен вызывать метод toString для числа и вычислять журналкак log(10) * number.toString().length() + log(asFloat("0." + number.toString()), где asFloat принимает строковое представление числа и преобразует его в число с плавающей точкой.

0 голосов
/ 20 февраля 2011

Если вам нужна максимальная точность, как насчет преобразования BigIntegers в BigDecimals и выполнения над ними алгебры.Если точность не имеет первостепенного значения, то, возможно, вы можете преобразовать ваши BigIntegers в двойные числа и сделать простую алгебру с ними.Возможно, вы можете рассказать нам больше о своей проблемной области и о том, почему вы считаете, что логарифмы - лучший способ.

...