/* Copyright (C) 2019 Julian RĂ¼th This file is part of Arb. Arb is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include #include "mag.h" #include "arf.h" static void mag_set_arf_dump(mag_t x, const arf_t y) { if (arf_is_special(y)) { if (arf_is_zero(y)) { mag_zero(x); } else if (arf_is_pos_inf(y)) { mag_inf(x); } else { /* a mag cannot be negative infinity or NaN */ flint_abort(); } } else { fmpz_t mantissa, exponent; fmpz_init(mantissa); fmpz_init(exponent); arf_get_fmpz_2exp(mantissa, exponent, y); if(fmpz_cmp_ui(mantissa, 1 << MAG_BITS) >= 0) flint_abort(); /* assert */ mag_set_ui(x, fmpz_get_ui(mantissa)); mag_mul_2exp_fmpz(x, x, exponent); fmpz_clear(exponent); fmpz_clear(mantissa); } } int mag_load_str(mag_t x, const char* data) { int err = 0; arf_t y; arf_init(y); err = arf_load_str(y, data); if (err) { arf_clear(y); return err; } mag_set_arf_dump(x, y); arf_clear(y); return err; } int mag_load_file(mag_t x, FILE* stream) { int err = 0; arf_t y; arf_init(y); err = arf_load_file(y, stream); if (err) { arf_clear(y); return err; } mag_set_arf_dump(x, y); arf_clear(y); return err; }