
In order to create an arbitrary precision floating point / drop in replacement for Double, I'm trying to wrap MPFR (http://www.mpfr.org/) using the FFI but despite all my efforts the simplest bit of code doesn't work. It compiles, it runs, but it crashes mockingly after pretending to work for a while.
I've done an interface to MPFR. See Michal's message. It isn't particularly fast but it works. You could improve/suggest improvements there, if you are interested.
Why does the C version work, but the Haskell version flake out?
I'm more or less guessing here, but it might have something to do with mpfr calling __gmp_allocate_func in init2.c which is called inside mpfr_init_set_si, coupled with what Judah Jacobson said. This is the only possible problem I can think of because when using custom memory interface and allocating with malloc all the problems seem to disappear. If you substitute your mpfr_set_signed_int for the one below, the noworks should become works. mpfr_ptr mpf_set_signed_int(int x) { mpfr_ptr result = mpf_new_mpfr(); mp_limb_t * limb = malloc(mpfr_custom_get_size(mpfr_get_default_prec())); mpfr_custom_init(limb, mpfr_get_default_prec()); mpfr_custom_init_set(result, MPFR_NAN_KIND, 0, mpfr_get_default_prec(), limb); if (result == NULL) return NULL; mpfr_set_si(result, x, GMP_RNDN); return result; }