Annotation of OpenXM_contrib/gmp/mpf/cmp.c, Revision 1.1.1.3
1.1 maekawa 1: /* mpf_cmp -- Compare two floats.
2:
1.1.1.3 ! ohara 3: Copyright 1993, 1994, 1996, 2001 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_cmp (mpf_srcptr u, mpf_srcptr v)
27: {
28: mp_srcptr up, vp;
29: mp_size_t usize, vsize;
30: mp_exp_t uexp, vexp;
31: int cmp;
32: int usign;
33:
34: uexp = u->_mp_exp;
35: vexp = v->_mp_exp;
36:
37: usize = u->_mp_size;
38: vsize = v->_mp_size;
39:
40: /* 1. Are the signs different? */
41: if ((usize ^ vsize) >= 0)
42: {
43: /* U and V are both non-negative or both negative. */
44: if (usize == 0)
45: /* vsize >= 0 */
46: return -(vsize != 0);
47: if (vsize == 0)
48: /* usize >= 0 */
49: return usize != 0;
50: /* Fall out. */
51: }
52: else
53: {
54: /* Either U or V is negative, but not both. */
55: return usize >= 0 ? 1 : -1;
56: }
57:
58: /* U and V have the same sign and are both non-zero. */
59:
60: usign = usize >= 0 ? 1 : -1;
61:
62: /* 2. Are the exponents different? */
63: if (uexp > vexp)
64: return usign;
65: if (uexp < vexp)
66: return -usign;
67:
68: usize = ABS (usize);
69: vsize = ABS (vsize);
70:
71: up = u->_mp_d;
72: vp = v->_mp_d;
73:
74: #define STRICT_MPF_NORMALIZATION 0
75: #if ! STRICT_MPF_NORMALIZATION
76: /* Ignore zeroes at the low end of U and V. */
77: while (up[0] == 0)
78: {
79: up++;
80: usize--;
81: }
82: while (vp[0] == 0)
83: {
84: vp++;
85: vsize--;
86: }
87: #endif
88:
89: if (usize > vsize)
90: {
91: cmp = mpn_cmp (up + usize - vsize, vp, vsize);
92: if (cmp == 0)
93: return usign;
94: }
95: else if (vsize > usize)
96: {
97: cmp = mpn_cmp (up, vp + vsize - usize, usize);
98: if (cmp == 0)
99: return -usign;
100: }
101: else
102: {
103: cmp = mpn_cmp (up, vp, usize);
104: if (cmp == 0)
105: return 0;
106: }
107: return cmp > 0 ? usign : -usign;
108: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>