Annotation of OpenXM_contrib/gmp/mpf/eq.c, Revision 1.1.1.3
1.1 maekawa 1: /* mpf_eq -- Compare two floats up to a specified bit #.
2:
1.1.1.3 ! ohara 3: Copyright 1993, 1995, 1996, 2001, 2002 Free Software Foundation, Inc.
1.1 maekawa 4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
1.1.1.2 maekawa 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
1.1 maekawa 10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1.1.1.2 maekawa 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
1.1 maekawa 15: License for more details.
16:
1.1.1.2 maekawa 17: You should have received a copy of the GNU Lesser General Public License
1.1 maekawa 18: along with the GNU MP 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:
25: int
26: mpf_eq (mpf_srcptr u, mpf_srcptr v, unsigned long int n_bits)
27: {
28: mp_srcptr up, vp;
29: mp_size_t usize, vsize, size, i;
30: mp_exp_t uexp, vexp;
31: int usign;
32:
33: uexp = u->_mp_exp;
34: vexp = v->_mp_exp;
35:
36: usize = u->_mp_size;
37: vsize = v->_mp_size;
38:
39: /* 1. Are the signs different? */
40: if ((usize ^ vsize) >= 0)
41: {
42: /* U and V are both non-negative or both negative. */
43: if (usize == 0)
44: return vsize == 0;
45: if (vsize == 0)
46: return 0;
47:
48: /* Fall out. */
49: }
50: else
51: {
52: /* Either U or V is negative, but not both. */
53: return 0;
54: }
55:
56: /* U and V have the same sign and are both non-zero. */
57:
58: usign = usize >= 0 ? 1 : -1;
59:
60: /* 2. Are the exponents different? */
61: if (uexp > vexp)
62: return 0; /* ??? handle (uexp = vexp + 1) */
63: if (vexp > uexp)
64: return 0; /* ??? handle (vexp = uexp + 1) */
65:
66: usize = ABS (usize);
67: vsize = ABS (vsize);
68:
69: up = u->_mp_d;
70: vp = v->_mp_d;
71:
72: /* Ignore zeroes at the low end of U and V. */
73: while (up[0] == 0)
74: {
75: up++;
76: usize--;
77: }
78: while (vp[0] == 0)
79: {
80: vp++;
81: vsize--;
82: }
83:
84: if (usize > vsize)
85: {
1.1.1.3 ! ohara 86: if (vsize * GMP_NUMB_BITS < n_bits)
1.1 maekawa 87: return 0; /* surely too different */
88: size = vsize;
89: }
90: else if (vsize > usize)
91: {
1.1.1.3 ! ohara 92: if (usize * GMP_NUMB_BITS < n_bits)
1.1 maekawa 93: return 0; /* surely too different */
94: size = usize;
95: }
96: else
97: {
98: size = usize;
99: }
100:
1.1.1.3 ! ohara 101: if (size > (n_bits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS)
! 102: size = (n_bits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS;
1.1 maekawa 103:
104: up += usize - size;
105: vp += vsize - size;
106:
107: for (i = size - 1; i >= 0; i--)
108: {
109: if (up[i] != vp[i])
110: return 0;
111: }
112:
113: return 1;
114: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>