Annotation of OpenXM_contrib/gmp/mpfr/exceptions.c, Revision 1.1
1.1 ! ohara 1: /* Exception flags and utilities.
! 2:
! 3: Copyright 2001 Free Software Foundation.
! 4:
! 5: This file is part of the MPFR Library.
! 6:
! 7: The MPFR Library is free software; you can redistribute it and/or modify
! 8: it under the terms of the GNU Lesser General Public License as published by
! 9: the Free Software Foundation; either version 2.1 of the License, or (at your
! 10: option) any later version.
! 11:
! 12: The MPFR Library is distributed in the hope that it will be useful, but
! 13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 15: License for more details.
! 16:
! 17: You should have received a copy of the GNU Lesser General Public License
! 18: along with the MPFR Library; see the file COPYING.LIB. If not, write to
! 19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: MA 02111-1307, USA. */
! 21:
! 22: #include "gmp.h"
! 23: #include "gmp-impl.h"
! 24: #include "mpfr.h"
! 25: #include "mpfr-impl.h"
! 26:
! 27: unsigned int __mpfr_flags = 0;
! 28:
! 29: mp_exp_t __mpfr_emin = MPFR_EMIN_DEFAULT;
! 30: mp_exp_t __mpfr_emax = MPFR_EMAX_DEFAULT;
! 31:
! 32: #undef mpfr_get_emin
! 33:
! 34: mp_exp_t
! 35: mpfr_get_emin (void)
! 36: {
! 37: return __mpfr_emin;
! 38: }
! 39:
! 40: #undef mpfr_set_emin
! 41:
! 42: int
! 43: mpfr_set_emin (mp_exp_t exponent)
! 44: {
! 45: if (exponent >= MPFR_EMIN_MIN && exponent <= MPFR_EMIN_MAX)
! 46: {
! 47: __mpfr_emin = exponent;
! 48: return 0;
! 49: }
! 50: else
! 51: {
! 52: return 1;
! 53: }
! 54: }
! 55:
! 56: #undef mpfr_get_emax
! 57:
! 58: mp_exp_t
! 59: mpfr_get_emax (void)
! 60: {
! 61: return __mpfr_emax;
! 62: }
! 63:
! 64: #undef mpfr_set_emax
! 65:
! 66: int
! 67: mpfr_set_emax (mp_exp_t exponent)
! 68: {
! 69: if (exponent >= MPFR_EMAX_MIN && exponent <= MPFR_EMAX_MAX)
! 70: {
! 71: __mpfr_emax = exponent;
! 72: return 0;
! 73: }
! 74: else
! 75: {
! 76: return 1;
! 77: }
! 78: }
! 79:
! 80: #undef mpfr_clear_flags
! 81:
! 82: void
! 83: mpfr_clear_flags (void)
! 84: {
! 85: __mpfr_flags = 0;
! 86: }
! 87:
! 88: #undef mpfr_clear_underflow
! 89:
! 90: void
! 91: mpfr_clear_underflow (void)
! 92: {
! 93: __mpfr_flags &= MPFR_FLAGS_ALL ^ MPFR_FLAGS_UNDERFLOW;
! 94: }
! 95:
! 96: #undef mpfr_clear_overflow
! 97:
! 98: void
! 99: mpfr_clear_overflow (void)
! 100: {
! 101: __mpfr_flags &= MPFR_FLAGS_ALL ^ MPFR_FLAGS_OVERFLOW;
! 102: }
! 103:
! 104: #undef mpfr_clear_nanflag
! 105:
! 106: void
! 107: mpfr_clear_nanflag (void)
! 108: {
! 109: __mpfr_flags &= MPFR_FLAGS_ALL ^ MPFR_FLAGS_NAN;
! 110: }
! 111:
! 112: #undef mpfr_clear_inexflag
! 113:
! 114: void
! 115: mpfr_clear_inexflag (void)
! 116: {
! 117: __mpfr_flags &= MPFR_FLAGS_ALL ^ MPFR_FLAGS_INEXACT;
! 118: }
! 119:
! 120: #undef mpfr_check_range
! 121:
! 122: int
! 123: mpfr_check_range (mpfr_ptr x, mp_rnd_t rnd_mode)
! 124: {
! 125: if (MPFR_IS_FP(x) && MPFR_NOTZERO(x))
! 126: { /* x is a non-zero FP */
! 127: mp_exp_t exp = MPFR_EXP(x);
! 128: if (exp < __mpfr_emin)
! 129: return mpfr_set_underflow(x, rnd_mode, MPFR_SIGN(x));
! 130: if (exp > __mpfr_emax)
! 131: return mpfr_set_overflow(x, rnd_mode, MPFR_SIGN(x));
! 132: }
! 133: return 0;
! 134: }
! 135:
! 136: #undef mpfr_underflow_p
! 137:
! 138: int
! 139: mpfr_underflow_p (void)
! 140: {
! 141: return __mpfr_flags & MPFR_FLAGS_UNDERFLOW;
! 142: }
! 143:
! 144: #undef mpfr_overflow_p
! 145:
! 146: int
! 147: mpfr_overflow_p (void)
! 148: {
! 149: return __mpfr_flags & MPFR_FLAGS_OVERFLOW;
! 150: }
! 151:
! 152: #undef mpfr_nanflag_p
! 153:
! 154: int
! 155: mpfr_nanflag_p (void)
! 156: {
! 157: return __mpfr_flags & MPFR_FLAGS_NAN;
! 158: }
! 159:
! 160: #undef mpfr_inexflag_p
! 161:
! 162: int
! 163: mpfr_inexflag_p (void)
! 164: {
! 165: return __mpfr_flags & MPFR_FLAGS_INEXACT;
! 166: }
! 167:
! 168: #undef mpfr_set_underflow
! 169:
! 170: int
! 171: mpfr_set_underflow (mpfr_ptr x, mp_rnd_t rnd_mode, int sign)
! 172: {
! 173: int inex;
! 174:
! 175: MPFR_CLEAR_FLAGS(x);
! 176: if ((rnd_mode == GMP_RNDU && sign > 0)
! 177: || (rnd_mode == GMP_RNDD && sign < 0))
! 178: {
! 179: mp_size_t xn;
! 180: mp_limb_t *xp;
! 181:
! 182: MPFR_EXP(x) = __mpfr_emin;
! 183: xn = (MPFR_PREC(x)-1)/BITS_PER_MP_LIMB;
! 184: xp = MPFR_MANT(x);
! 185: xp[xn] = GMP_LIMB_HIGHBIT;
! 186: MPN_ZERO(xp, xn);
! 187: inex = 1;
! 188: }
! 189: else
! 190: {
! 191: MPFR_SET_ZERO(x);
! 192: inex = -1;
! 193: }
! 194: if (MPFR_SIGN(x) != sign)
! 195: MPFR_CHANGE_SIGN(x);
! 196: __mpfr_flags |= MPFR_FLAGS_INEXACT | MPFR_FLAGS_UNDERFLOW;
! 197: return sign > 0 ? inex : -inex;
! 198: }
! 199:
! 200: #undef mpfr_set_overflow
! 201:
! 202: int
! 203: mpfr_set_overflow (mpfr_ptr x, mp_rnd_t rnd_mode, int sign)
! 204: {
! 205: int inex;
! 206:
! 207: MPFR_CLEAR_FLAGS(x);
! 208: if ((rnd_mode == GMP_RNDU && sign < 0)
! 209: || (rnd_mode == GMP_RNDD && sign > 0))
! 210: {
! 211: mp_size_t xn, i;
! 212: int sh;
! 213: mp_limb_t *xp;
! 214:
! 215: MPFR_EXP(x) = __mpfr_emax;
! 216: xn = 1 + (MPFR_PREC(x) - 1) / BITS_PER_MP_LIMB;
! 217: sh = xn * BITS_PER_MP_LIMB - MPFR_PREC(x);
! 218: xp = MPFR_MANT(x);
! 219: xp[0] = MP_LIMB_T_MAX << sh;
! 220: for (i = 1; i < xn; i++)
! 221: xp[i] = MP_LIMB_T_MAX;
! 222: inex = -1;
! 223: }
! 224: else
! 225: {
! 226: MPFR_SET_INF(x);
! 227: inex = 1;
! 228: }
! 229: if (MPFR_SIGN(x) != sign)
! 230: MPFR_CHANGE_SIGN(x);
! 231: __mpfr_flags |= MPFR_FLAGS_INEXACT | MPFR_FLAGS_OVERFLOW;
! 232: return sign > 0 ? inex : -inex;
! 233: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>