Correct wrong check if mpz fits in word and float truncation.

  mpz_get_si and mpz_get_ui only returns the unmodified bits if signs
match. To avoid the need of calling mpz_and and then mpz_get_ui, just
read the bits from the gmp pointer.
  There was a wrong check in the 32 bit implementation, that was not
properly checking that a positive int64 would not became a negative
int32 and vice versa (e.g. top word is zero, but bottom word is
negative).
  Another problem corrected was truncation of floats to integers,
that was not using the proper 32 or 64 bit truncation.
Do not coerce integers to float32, use float64 instead

  This should reduce (possibly eliminate) numeric noise of results
on 32 and 64 bit as integer/float32 conversion should not be used.