summaryrefslogtreecommitdiff
path: root/div_ui.c
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2003-11-04 13:15:26 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2003-11-04 13:15:26 +0000
commitabfa7f839fabfe6a797057128abff86d598076d9 (patch)
tree478f997f6445673a3f535f08caf32f9e7075ea33 /div_ui.c
parent342b90d25ebeab276e971826f3a1c8ffbb8f98a6 (diff)
downloadmpfr-abfa7f839fabfe6a797057128abff86d598076d9.tar.gz
+ Remove MPFR_CLEAR_NAN and MPFR_CLEAR_INF. Only use MPFR_CLEAR_FLAGS.
MPFR_SET_INF, MPFR_SET_ZERO and MPFR_SET_ZERO must clear the flags before setting them. + Add a new test in tacosh.c : check Inf / Nan flags. + Use MPFR_IS_SINGULAR in all the remaining files. + Fix the use of MPFR_CLEAR_FLAGS. + mpfr-impl.h auto include gmp.h, gmp-impl.h, mpfr.h and limits.h. + Rename _PROTO to _MPFR_PROTO, and remove _GMP_PROTO. + Add MPFR_INT_SIGN macro. + Encapsulate a few more the sign. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2529 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'div_ui.c')
-rw-r--r--div_ui.c102
1 files changed, 54 insertions, 48 deletions
diff --git a/div_ui.c b/div_ui.c
index 9e6380f30..abcf052b1 100644
--- a/div_ui.c
+++ b/div_ui.c
@@ -36,48 +36,53 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
int inexact, middle = 1;
TMP_DECL(marker);
- if (MPFR_IS_NAN(x))
+ if (MPFR_UNLIKELY( MPFR_IS_SINGULAR(x) ))
{
- MPFR_SET_NAN(y);
- MPFR_RET_NAN;
- }
-
- MPFR_CLEAR_NAN(y); /* clear NaN flag */
-
- if (MPFR_IS_INF(x))
- {
- MPFR_SET_INF(y);
- MPFR_SET_SAME_SIGN(y, x);
- MPFR_RET(0);
- }
-
- if (u == 0)
- {
- if (MPFR_IS_ZERO(x)) /* 0/0 is NaN */
+ if (MPFR_IS_NAN(x))
{
MPFR_SET_NAN(y);
MPFR_RET_NAN;
}
- else /* x/0 is Inf */
- {
+ else if (MPFR_IS_INF(x))
+ {
MPFR_SET_INF(y);
MPFR_SET_SAME_SIGN(y, x);
- MPFR_RET(0);
+ MPFR_RET(0);
+ }
+ else if (MPFR_IS_ZERO(x))
+ {
+ if (u == 0)/* 0/0 is NaN */
+ {
+ MPFR_SET_NAN(y);
+ MPFR_RET_NAN;
+ }
+ else
+ {
+ MPFR_SET_ZERO(y);
+ MPFR_RET(0);
+ }
}
+ else
+ MPFR_ASSERTN(1);
}
- MPFR_CLEAR_INF(y);
- MPFR_SET_SAME_SIGN(y, x);
-
- if (MPFR_IS_ZERO(x))
+ if (MPFR_UNLIKELY(u == 0))
{
- MPFR_SET_ZERO(y);
+ /* x/0 is Inf */
+ MPFR_SET_INF(y);
+ MPFR_SET_SAME_SIGN(y, x);
MPFR_RET(0);
}
+ MPFR_CLEAR_FLAGS(y);
+
+ MPFR_SET_SAME_SIGN(y, x);
+
TMP_MARK(marker);
- xn = (MPFR_PREC(x) - 1)/BITS_PER_MP_LIMB + 1;
- yn = (MPFR_PREC(y) - 1)/BITS_PER_MP_LIMB + 1;
+ xn = MPFR_LIMB_SIZE(x);
+ /*(MPFR_PREC(x) - 1)/BITS_PER_MP_LIMB + 1;*/
+ yn = MPFR_LIMB_SIZE(y);
+ /*(MPFR_PREC(y) - 1)/BITS_PER_MP_LIMB + 1;*/
xp = MPFR_MANT(x);
yp = MPFR_MANT(y);
@@ -147,41 +152,42 @@ mpfr_div_ui (mpfr_ptr y, mpfr_srcptr x, unsigned long int u, mp_rnd_t rnd_mode)
switch (rnd_mode)
{
case GMP_RNDZ:
- MPFR_RET(-MPFR_SIGN(x)); /* result is inexact */
+ MPFR_RET(-MPFR_INT_SIGN(x)); /* result is inexact */
case GMP_RNDU:
- if (MPFR_SIGN(y) > 0)
+ if (MPFR_IS_POS(y))
mpfr_add_one_ulp (y, rnd_mode);
MPFR_RET(1); /* result is inexact */
case GMP_RNDD:
- if (MPFR_SIGN(y) < 0)
+ if (MPFR_IS_NEG(y))
mpfr_add_one_ulp (y, rnd_mode);
MPFR_RET(-1); /* result is inexact */
case GMP_RNDN:
if (sh && d < (MP_LIMB_T_ONE << (sh - 1)))
- MPFR_RET(-MPFR_SIGN(x));
+ MPFR_RET(-MPFR_INT_SIGN(x));
else if (sh && d > (MP_LIMB_T_ONE << (sh - 1)))
{
mpfr_add_one_ulp (y, rnd_mode);
- MPFR_RET(MPFR_SIGN(x));
+ MPFR_RET(MPFR_INT_SIGN(x));
+ }
+ else /* sh = 0 or d = 1 << (sh-1) */
+ {
+ /* we are in the middle if:
+ (a) sh > 0 and inexact == 0
+ (b) sh=0 and middle=1
+ */
+ if ((sh && inexact) || (!sh && (middle > 0)) ||
+ (*yp & (MP_LIMB_T_ONE << sh)))
+ {
+ mpfr_add_one_ulp (y, rnd_mode);
+ MPFR_RET(MPFR_INT_SIGN(x));
+ }
+ else
+ MPFR_RET(-MPFR_INT_SIGN(x));
}
- else /* sh = 0 or d = 1 << (sh-1) */
- {
- /* we are in the middle if:
- (a) sh > 0 and inexact == 0
- (b) sh=0 and middle=1
- */
- if ((sh && inexact) || (!sh && (middle > 0)) ||
- (*yp & (MP_LIMB_T_ONE << sh)))
- {
- mpfr_add_one_ulp (y, rnd_mode);
- MPFR_RET(MPFR_SIGN(x));
- }
- else
- MPFR_RET(-MPFR_SIGN(x));
- }
}
- MPFR_RET(inexact); /* should never go here */
+ MPFR_ASSERTN(1); /* should never go here */
+ return 0; /* To avoid warning*/
}