1/* mpz_set_f (dest_integer, src_float) -- Assign DEST_INTEGER from SRC_FLOAT. 2 3Copyright 1996, 2001 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20#include "gmp.h" 21#include "gmp-impl.h" 22 23 24void 25mpz_set_f (mpz_ptr w, mpf_srcptr u) 26{ 27 mp_ptr wp, up; 28 mp_size_t size; 29 mp_exp_t exp; 30 31 /* abs(u)<1 truncates to zero */ 32 exp = EXP (u); 33 if (exp <= 0) 34 { 35 SIZ(w) = 0; 36 return; 37 } 38 39 MPZ_REALLOC (w, exp); 40 wp = PTR(w); 41 up = PTR(u); 42 43 size = SIZ (u); 44 SIZ(w) = (size >= 0 ? exp : -exp); 45 size = ABS (size); 46 47 if (exp > size) 48 { 49 /* pad with low zeros to get a total "exp" many limbs */ 50 mp_size_t zeros = exp - size; 51 MPN_ZERO (wp, zeros); 52 wp += zeros; 53 } 54 else 55 { 56 /* exp<=size, trucate to the high "exp" many limbs */ 57 up += (size - exp); 58 size = exp; 59 } 60 61 MPN_COPY (wp, up, size); 62} 63