开发者

Using logarithm instead of division for large numbers?

开发者 https://www.devze.com 2023-02-12 00:10 出处:网络
I couldn\'t really come up with a proper title for my question but allow me to present my case; I want to calculate a significance ratio in theform: p = 1 - X / Y

I couldn't really come up with a proper title for my question but allow me to present my case; I want to calculate a significance ratio in the form: p = 1 - X / Y

Here X comes from an iterative process; the process takes a large number of steps and counts how many different ways the process can end up开发者_C百科 in different states (stored in a HashMap). Once the iteration is over, I select a number of states and sum their values. It's hard to tell how large these numbers are so I am intending to implement the sum as BigInteger.

Y, on the other hand comes from a binomial coefficient with numbers in thousands-scale. I am inclined to use logGamma to calculate these coefficients, which as a result give me the natural logarithm of the value.

What I am interested in is to do division X / Y in the best/most effective way. If I can get X in the natural logarithm then I could subtract the powers and have my result as 1 - e ^ (lnX - lnY).

I see that BigInteger can't be logarithmized by Math.log, what can I do in this case?


You may be able to use doubles. A double can be extremely large, about 1.7e308. What it lacks is precision: it only supports about 15 digits. But if you can live with 15 digits of precision (in other words, if you don't care about the difference between 1,000,000,000,000,000 and 1,000,000,000,000,001) then doubles might get you close enough.


If you are calculating binomial coefficients on numbers in the thousands, then Doubles will not be good enough.

Instead I would be inclined to call the toString method on the number, and compute the log as log(10) * number.toString().length() + log(asFloat("0." + number.toString()) where asFloat takes a string representation of a number and converts it to a float.


If you need maximum precision, how about converting the BigIntegers into BigDecimals and doing algebra on them. If precision isn't paramount, then perhaps you can convert your BigIntegers into doubles and do simple algebra with them. Perhaps you can tell us more about your problem domain and why you feel logarithms are the best way to go.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号