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;
}
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to