Hello,

FWIW, I filed and then eventually closed as will not fix

JDK-4529368: RFE: Add a BigBinary class for arbitrary precision floating-point computation
    https://bugs.openjdk.java.net/browse/JDK-4529368

If such a BigBinary type existed, I would certainly use it when writing tests of double mathematical functions, but in the Java ecosystem, I'm not sure where else it would get used.

The BigDecimal type supports both floating-point and fixed-point styles of computation. In floating-point computation, whatever the base, conceptually the number of digits of precision is fixed and a separate exponent field is used to represent values of different magnitudes. With BigDecimal, the precision can be varied by using the arithmetic methods which take a MathContext object as an argument.

I'm not sure which algorithm you used to compute pi, but I would be very surprised by a ~8 X speed difference between BigInteger and BigDecimal if the same computation was being under on the BigDecimal values, meaning the BigIntegers held in the BigDecimals were the same as the BigIntegers in the BigInteger computation. A BigDecimal object is a fairly small wrapper around a BigInteger and updating the scale/exponent field isn't too much additional work.

Cheers,

-Joe

On 02/07/2014 02:44 AM, Dmitry Nadezhin wrote:
I think that better name is BigBinary.
Both BigDecimal and BigBinary are floating-point number
with radix=10 and radix=2 respectively.

More general approach is an abstract class or interface Rational
which has implementation subclasses.
Each nonzero rational number P/Q can be represented as
P/Q = p/q * 2^e , where e is integer, p and q are odd integers and GCD(p,q)
= 1.
Then BigBinary is a subclass with q=1.
Arithmetic operations on Rationals are implemented by general algorithm
when arguments are true
rationals (q!=1) and by specific algorithms when they are Binaries (q=1).

This is elaborated here:
http://interval.louisiana.edu/reliable-computing-journal/volume-19/reliable-computing-19-pp-229-247.pdf
https://java.net/projects/jinterval/sources/svn/show/trunk/jinterval/jinterval-rational-java/src/main/java/net/java/jinterval/rational



On Thu, Feb 6, 2014 at 9:11 PM, Tim Buktu <tbu...@hotmail.com> wrote:

Hi,

now that BigInteger deals better with large numbers, it would be nice
for that to translate into an improvement in BigDecimal performance
because BigDecimal is essentially a wrapper around BigInteger.
Unfortunately, BigDecimal is still slower than BigInteger because it has
to scale and round.

I don't see a way to fix this without breaking the
BigDecimal=BigInteger*10^n paradigm, but it could be done by introducing
something like a BigFloat class that wraps a BigInteger such that
BigFloat=BigInteger*2^n. I would expect the code to be less complex than
BigDecimal because the only places it would have to deal with powers of
ten would be conversion from and to String or BigDecimal. It would also
be faster than BigDecimal for the same reason, but the downside is that
it wouldn't accurately represent decimal fractions (just like float and
double).

Is this something that would be beneficial in the real world?

I also did a little experiment to see how long a computation would take
using BigDecimals vs the same computation using fixed-point BigInteger
arithmetic. I wrote two programs that calculate pi to a million digits.
The BigInteger version took 3 minutes; the BigDecimal version took 28
minutes (both single-threaded).

Tim


Reply via email to