summaryrefslogtreecommitdiff
path: root/eq.c
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2003-10-28 16:31:13 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2003-10-28 16:31:13 +0000
commit117edf14c822a22cdd9c25689aeadc904a1a30d1 (patch)
treee39bd61cefc24cc6cfbc5b2b956e4fb36015d111 /eq.c
parent734c0a144b04e2cae4e67b394010e3f6e3cadecc (diff)
downloadmpfr-117edf14c822a22cdd9c25689aeadc904a1a30d1.tar.gz
Use of MPFR_UNLIKELY and MPFR_IS_SINGULAR for fast detection of special values (Nan, Inf or Zero).
Start to encapsulate the sign to be independant of the reprensation (Must be 1 or -1). git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2525 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'eq.c')
-rw-r--r--eq.c39
1 files changed, 14 insertions, 25 deletions
diff --git a/eq.c b/eq.c
index bbdf12de6..d1a17fcc9 100644
--- a/eq.c
+++ b/eq.c
@@ -34,35 +34,24 @@ mpfr_eq (mpfr_srcptr u, mpfr_srcptr v, unsigned long int n_bits)
mp_srcptr up, vp;
mp_size_t usize, vsize, size, i;
mp_exp_t uexp, vexp;
- int usign, k;
+ int k;
- if (MPFR_IS_NAN(u) || MPFR_IS_NAN(v))
- return 0; /* non equal */
-
- usign = MPFR_SIGN(u);
-
- if (MPFR_IS_INF(u))
- return MPFR_IS_INF(v) && usign == MPFR_SIGN(v); /* +Inf = +Inf */
- else if (MPFR_IS_INF(v))
- return 0; /* +Inf != -Inf */
-
- /* 1. Are the signs different? */
- if (usign == MPFR_SIGN(v))
+ if (MPFR_ARE_SINGULAR(u, v))
{
- /* U and V are both non-negative or both negative. */
- if (MPFR_IS_ZERO(u))
- return MPFR_IS_ZERO(v); /* 0 = 0 */
- if (MPFR_IS_ZERO(v))
- return MPFR_IS_ZERO(u); /* 0 = 0 */
-
- /* Fall out. */
- }
- else
- {
- /* Either U or V is negative, but not both. */
- return MPFR_IS_ZERO(u) && MPFR_IS_ZERO(v);
+ if (MPFR_IS_NAN(u) || MPFR_IS_NAN(v))
+ return 0; /* non equal */
+ else if (MPFR_IS_INF(u) && MPFR_IS_INF(v))
+ return (MPFR_SIGN(u) == MPFR_SIGN(v));
+ else if (MPFR_IS_ZERO(u) && MPFR_IS_ZERO(v))
+ return 1;
+ else
+ return 0;
}
+ /* 1. Are the signs different? */
+ if (MPFR_SIGN(u) != MPFR_SIGN(v))
+ return 0;
+
uexp = MPFR_GET_EXP (u);
vexp = MPFR_GET_EXP (v);