summaryrefslogtreecommitdiff
path: root/sub.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 /sub.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 'sub.c')
-rw-r--r--sub.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/sub.c b/sub.c
index 18e3563fa..5bb493f29 100644
--- a/sub.c
+++ b/sub.c
@@ -35,8 +35,7 @@ mpfr_sub (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode)
MPFR_SET_NAN(a);
MPFR_RET_NAN;
}
- MPFR_CLEAR_NAN(a);
- if (MPFR_IS_INF(b))
+ else if (MPFR_IS_INF(b))
{
if (!MPFR_IS_INF(c) || MPFR_SIGN(b) != MPFR_SIGN(c))
{
@@ -50,30 +49,28 @@ mpfr_sub (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode)
MPFR_RET_NAN;
}
}
- else
- if (MPFR_IS_INF(c))
- {
- MPFR_SET_INF(a);
- if (MPFR_SIGN(c) == MPFR_SIGN(a))
- MPFR_CHANGE_SIGN(a);
- MPFR_RET(0); /* exact */
- }
- if (MPFR_IS_ZERO(b))
+ else if (MPFR_IS_INF(c))
+ {
+ MPFR_SET_INF(a);
+ if (MPFR_SIGN(c) == MPFR_SIGN(a))
+ MPFR_CHANGE_SIGN(a);
+ MPFR_RET(0); /* exact */
+ }
+ else if (MPFR_IS_ZERO(b))
{
if (MPFR_IS_ZERO(c))
{
if (MPFR_SIGN(a) !=
(rnd_mode != GMP_RNDD ?
- ((MPFR_SIGN(b) < 0 && MPFR_SIGN(c) > 0) ? -1 : 1) :
- ((MPFR_SIGN(b) > 0 && MPFR_SIGN(c) < 0) ? 1 : -1)))
+ ((MPFR_IS_NEG(b) && MPFR_IS_POS(c)) ? -1 : 1) :
+ ((MPFR_IS_POS(b) && MPFR_IS_NEG(c)) ? 1 : -1)))
MPFR_CHANGE_SIGN(a);
- MPFR_CLEAR_INF(a);
MPFR_SET_ZERO(a);
MPFR_RET(0); /* 0 - 0 is exact */
}
return mpfr_neg (a, c, rnd_mode);
}
- if (MPFR_IS_ZERO(c))
+ else if (MPFR_IS_ZERO(c))
{
return mpfr_set (a, b, rnd_mode);
}
@@ -93,7 +90,7 @@ mpfr_sub (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mp_rnd_t rnd_mode)
eb = MPFR_GET_EXP (b);
ec = MPFR_GET_EXP (c);
if (eb < ec)
- { /* exchange rounding modes towards +/- infinity */
+ { /* exchange rounding modes towards +/- infinity */
int inexact;
if (rnd_mode == GMP_RNDU)
rnd_mode = GMP_RNDD;