On Sat, May 28, 2016 at 4:02 PM, digxx <[email protected]> wrote:
> maybe one more thing. How can I extract the number from this form [0.1234...
> +- 12341e-12341] + i*0 to a normal number such that I can work with it in
> later calculations
You can do this:
julia> Float64(real(hyp1f1(R(1), R(1), R(1))))
2.718281828459045
Looks like conversion to BigFloat has not been implemented yet (though
conversion from a BigFloat works). But it can be done with a few lines
of code:
julia> function bf(x::arb)
mid = ccall((:arb_mid_ptr, :libarb), Ptr{Void}, (Ptr{arb}, ), &x)
y = BigFloat()
ccall((:arf_get_mpfr, :libarb), Int, (Ptr{BigFloat},
Ptr{Void}, Int), &y, mid, 0)
return y
end
bf (generic function with 1 method)
julia> x = hyp1f1(R(1), R(1), R(1));
julia> bf(real(x))
2.718281828459045235360287471352662497747295538978622980871818032370215364509352
julia> bf(imag(x))
0.000000000000000000000000000000000000000000000000000000000000000000000000000000
Another thing worth pointing out is that R(128) can give results with
much less than 128 bits of accuracy in the final result. You can check
the number of accurate bits like this:
julia> accuracy_bits(x)
126
If the accuracy is too low, you can try again with higher precision.
Here's an example:
julia> x = hyp1f1(R(-100), R(1), R(20))
[1854.0367 +/- 4.44e-5] + i*0
julia> accuracy_bits(x)
26
julia> R2 = AcbField(256);
julia> x = hyp1f1(R2(-100), R2(1), R2(20))
[1854.0367283243398148762134198258916179287877866 +/- 4.48e-44] + i*0
julia> accuracy_bits(x)
154
So you can easily write a hyp1f1 wrapper for BigFloat that
automatically doubles the precision until the result is guaranteed to
be accurate to any accuracy you want.
Fredrik