You could use the Digital Library of Mathematical Functions:
http://dlmf.nist.gov/
Here are few short things about programming in Java and calculating special functions which I have learned from experience.
If you have the CPU power to do so, use BigDecimal as much as possible. At the moment (July 2015), Microsoft seems not to have an in-house arbitrary numerical precision library in the .NET framework. This makes scientific computing tricky. How they achieved the precision they did in VB6/VBA for Excel eludes me.
BigDecimal, on the other hand, is relatively easy to use. I was introduced to BigDecimal by a friend and read about it in a Murach book on Java 5. I'd highly suggest the Oracle documentation:
http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html
Secondly, there is a difference, as you have probably observed, between floating-point error and the mathematical-numerical error introduced in an approximation to a special function. Both the mathematical-numerical error and the floating-point error conspire to make things difficult for application development. Use a lot of different programs to check yourself and your calculation.
Thirdly, string constructors for BigDecimal are preferable to the double constructor in many cases. See the Oracle documentation above.
Fourthly, be very careful in using BigDecimal with the unlimited precision of MathContext. Be aware that you will probably have to use setScale to introduce how many decimal places you will need for your application to avoid infinitely repeating decimal expressions and the exceptions thrown to you by the JVM.
Fifthly, try to check integer arguments for the first-kind modified Bessel function first. Also, you can calculate Bessel functions either from the recursion relations available to you or from their definitions as degenerate hypergeometric functions.
Finally,
Good luck!