summaryrefslogtreecommitdiff
path: root/minmax.c
diff options
context:
space:
mode:
Diffstat (limited to 'minmax.c')
-rw-r--r--minmax.c80
1 files changed, 48 insertions, 32 deletions
diff --git a/minmax.c b/minmax.c
index 0cb986ceb..bc57da7e4 100644
--- a/minmax.c
+++ b/minmax.c
@@ -19,7 +19,6 @@ along with the MPFR Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
-#include <stdio.h>
#include "gmp.h"
#include "gmp-impl.h"
#include "mpfr.h"
@@ -32,50 +31,67 @@ MA 02111-1307, USA. */
*/
int
-mpfr_min (mpfr_ptr z, mpfr_srcptr x ,mpfr_srcptr y ,mp_rnd_t rnd_mode)
+mpfr_min (mpfr_ptr z, mpfr_srcptr x, mpfr_srcptr y, mp_rnd_t rnd_mode)
{
- if (MPFR_IS_NAN(x) && MPFR_IS_NAN(y) )
+ if (MPFR_IS_NAN(x) && MPFR_IS_NAN(y) )
{
MPFR_SET_NAN(z);
- return 1;
+ MPFR_RET_NAN;
}
- MPFR_CLEAR_NAN(z);
- if (MPFR_IS_NAN(x) )
- return mpfr_set(z,y,rnd_mode);
-
- if (MPFR_IS_NAN(y) )
- return mpfr_set(z,x,rnd_mode);
-
- if(mpfr_cmp(x,y) <= 0)
- return mpfr_set(z,x,rnd_mode);
- else
- return mpfr_set(z,y,rnd_mode);
+ MPFR_CLEAR_NAN(z);
+
+ if (MPFR_IS_NAN(x))
+ return mpfr_set(z, y, rnd_mode);
+
+ if (MPFR_IS_NAN(y))
+ return mpfr_set(z, x, rnd_mode);
+
+ if (MPFR_IS_FP(x) && MPFR_IS_ZERO(x) && MPFR_IS_FP(y) && MPFR_IS_ZERO(y))
+ {
+ if (MPFR_SIGN(x) < 0)
+ return mpfr_set(z, x, rnd_mode);
+ else
+ return mpfr_set(z, y, rnd_mode);
+ }
+
+ if (mpfr_cmp(x,y) <= 0)
+ return mpfr_set(z, x, rnd_mode);
+ else
+ return mpfr_set(z, y, rnd_mode);
}
+
/* The computation of z=max(x,y)
z=x if x >= y
z=y if x < y
*/
+
int
-mpfr_max (mpfr_ptr z, mpfr_srcptr x ,mpfr_srcptr y ,mp_rnd_t rnd_mode)
+mpfr_max (mpfr_ptr z, mpfr_srcptr x, mpfr_srcptr y, mp_rnd_t rnd_mode)
{
- if (MPFR_IS_NAN(x) && MPFR_IS_NAN(y) )
+ if (MPFR_IS_NAN(x) && MPFR_IS_NAN(y) )
{
- MPFR_SET_NAN(z);
- return 1;
+ MPFR_SET_NAN(z);
+ MPFR_RET_NAN;
}
- MPFR_CLEAR_NAN(z);
-
- if (MPFR_IS_NAN(x) )
- return mpfr_set(z,y,rnd_mode);
-
- if (MPFR_IS_NAN(y) )
- return mpfr_set(z,x,rnd_mode);
-
- if(mpfr_cmp(x,y) <= 0)
- return mpfr_set(z,y,rnd_mode);
- else
- return mpfr_set(z,x,rnd_mode);
-}
+ MPFR_CLEAR_NAN(z);
+
+ if (MPFR_IS_NAN(x))
+ return mpfr_set(z, y, rnd_mode);
+ if (MPFR_IS_NAN(y))
+ return mpfr_set(z, x, rnd_mode);
+ if (MPFR_IS_FP(x) && MPFR_IS_ZERO(x) && MPFR_IS_FP(y) && MPFR_IS_ZERO(y))
+ {
+ if (MPFR_SIGN(x) < 0)
+ return mpfr_set(z, y, rnd_mode);
+ else
+ return mpfr_set(z, x, rnd_mode);
+ }
+
+ if (mpfr_cmp(x,y) <= 0)
+ return mpfr_set(z, y, rnd_mode);
+ else
+ return mpfr_set(z, x, rnd_mode);
+}