diff --git a/cbits/float.c b/cbits/float.c
index ec2ec13432928bbd7df72f1129477e6915f1fb5f..73a89f577a3184a12d9775969da9bc340c102bf4 100644
--- a/cbits/float.c
+++ b/cbits/float.c
@@ -11,6 +11,7 @@
/* #include "PosixSource.h" */
#include "Rts.h"
#include "gmp.h"
+#include "GmpDerivedConstants.h"
#include <math.h>
@@ -21,15 +22,7 @@
* (lib/fltcode.c).
*/
-#ifdef _SHORT_LIMB
-#define SIZEOF_LIMB_T SIZEOF_UNSIGNED_INT
-#else
-#ifdef _LONG_LONG_LIMB
-#define SIZEOF_LIMB_T SIZEOF_UNSIGNED_LONG_LONG
-#else
-#define SIZEOF_LIMB_T SIZEOF_UNSIGNED_LONG
-#endif
-#endif
+#define SIZEOF_LIMB_T SIZEOF_MP_LIMB_T
#if SIZEOF_LIMB_T == 4
#define GMP_BASE 4294967296.0
diff --git a/cbits/gmp-wrappers.cmm b/cbits/gmp-wrappers.cmm
index eb555fd38210bca0701f3ca25068ec17fefb3ceb..4c7df574e757ddd3e4026a785171070994d2540a 100644
--- a/cbits/gmp-wrappers.cmm
+++ b/cbits/gmp-wrappers.cmm
@@ -80,6 +80,10 @@ import "rts" stg_INTLIKE_closure;
the case for all the platforms that GHC supports, currently.
-------------------------------------------------------------------------- */
+#if SIZEOF_MP_LIMB_T != SIZEOF_W
+#error "sizeof(mp_limb_t) != sizeof(W_)"
+#endif
+
/* This is used when a dummy pointer is needed for a ByteArray# return value
Ideally this would be a statically allocated 'ByteArray#'
diff --git a/mkGmpDerivedConstants/mkGmpDerivedConstants.c b/mkGmpDerivedConstants/mkGmpDerivedConstants.c
index ed07111e0692dbaa0292aa443b0245ccf1249e22..fb7290f6826b32a2b86f7c084a31ef8769012f7e 100644
--- a/mkGmpDerivedConstants/mkGmpDerivedConstants.c
+++ b/mkGmpDerivedConstants/mkGmpDerivedConstants.c
@@ -69,6 +69,7 @@ main(int argc, char *argv[])
struct_field(MP_INT,_mp_alloc);
struct_field(MP_INT,_mp_size);
struct_field(MP_INT,_mp_d);
+ def_size("MP_LIMB_T", sizeof(mp_limb_t));
return 0;
}