Java BigDecimal trigonometric methods
Solution 1
ApFloat is a library which contains arbitrary-precision approximations of trigometric functions and non-integer powers both; however, it uses its own internal representations, rather than BigDecimal
and BigInteger
. I haven't used it before, so I can't vouch for its correctness or performance characteristics, but the api seems fairly complete.
Solution 2
BigDecimal
does not provide these methods because BigDecimal
models a rational number. Trigonometric functions, square roots and powers to non-integers (which I guess includes square roots) all generate irrational numbers.
These can be approximated with an arbitrary-precision number but the exact value can't be stored in a BigDecimal
. It's not really what they're for. If you're approximating something anyway, you may as well just use a double
.
Solution 3
The big-math library provides all the standard advanced mathematical functions (pow, sqrt, log, sin, ...) for BigDecimal.
https://github.com/eobermuhlner/big-math
Marco
Updated on June 03, 2022Comments
-
Marco almost 2 years
I am developing a mathematical parser which is able to evaluate String like
'5+b*sqrt(c^2)'
. I am using ANTLR for the parsing and make good progress. Now I fell over the Java classBigDecimal
and thought: hey, why not thinking about precision here.My problem is that the Java API does not provide trigonometric methods for
BigDecimal
s likejava.lang.Math
. Do you know if there are any good math libraries like Apache Commons out there that deal with this problem?The other questions is how to realize the power method so that I can calculate 4.9 ^ 1.4 with
BigDecimal
s. Is this possible?A book request about numerical computing is also appreciated.
-
Pete Kirkham over 14 yearsOnly for some definitions of best. 'broadest' possibly, but always check the algorithms against other sources, and never use the implementations directly - at least if they haven't updated the 1 based indexing in the C version using undefined behaviour.
-
Marco over 14 yearsJust found it myself and have seen that it supports pretty much everything I need. I will keep you posted if everything works
-
Admin over 8 yearsdouble does also approximate, but with a fixed size of bits. BigDecimals can use more bits.
-
Ky - about 8 years
BigDecimal
is approximate; that's why if you try to doBigDecimal.ONE.divide(BigDecimal.valueOf(3))
, you get ajava.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
Terminating equations work fine, but for non-terminating ones, you must specify an arbitrary precision. -
Al G Johnston over 4 yearsThis library works great for populating accurate double values when I set the accuracy to 1074 decimal places, which is the maximum absolute value of the negative exponent of a Java primitive double value.
-
Eric Obermühlner over 4 yearsI don't think you need 1074 decimal places. The type double as defined in IEEE 754 binary64 is equivalent to MathContext.DECIMAL64 and has 16 digits precision for the mantissa.
-
Eric Obermühlner over 4 yearsTo accurately calculate a double value I would use MathContext.DECIMAL128 (34 digits). Remember that precision is not the same thing as digits after the decimal point. Precision in this context refers to the number of significant digits.