Annotation of OpenXM_contrib/gmp/mpfr/tests/tfma.c, Revision 1.1
1.1 ! ohara 1: /* Test file for mpfr_fma.
! 2:
! 3: Copyright 2001 Free Software Foundation.
! 4: Adapted from tarctan.c.
! 5:
! 6: This file is part of the MPFR Library.
! 7:
! 8: The MPFR Library is free software; you can redistribute it and/or modify
! 9: it under the terms of the GNU Lesser General Public License as published by
! 10: the Free Software Foundation; either version 2.1 of the License, or (at your
! 11: option) any later version.
! 12:
! 13: The MPFR Library is distributed in the hope that it will be useful, but
! 14: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 15: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 16: License for more details.
! 17:
! 18: You should have received a copy of the GNU Lesser General Public License
! 19: along with the MPFR Library; see the file COPYING.LIB. If not, write to
! 20: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 21: MA 02111-1307, USA. */
! 22:
! 23: #include <stdio.h>
! 24: #include <limits.h>
! 25: #include <stdlib.h>
! 26: #include "gmp.h"
! 27: #include "gmp-impl.h"
! 28: #include "mpfr.h"
! 29: #include "mpfr-impl.h"
! 30: #include "mpfr-test.h"
! 31:
! 32:
! 33: int
! 34: main (int argc, char *argv[])
! 35: {
! 36: mpfr_t x, y,z,s;
! 37: mpfr_init (x);
! 38: mpfr_init (s);
! 39: mpfr_init (y);
! 40: mpfr_init (z);
! 41:
! 42: /* check special cases */
! 43: mpfr_set_prec (x, 2);
! 44: mpfr_set_prec (y, 2);
! 45: mpfr_set_prec (z, 2);
! 46: mpfr_set_prec (s, 2);
! 47: mpfr_set_d (x, -0.75, GMP_RNDN);
! 48: mpfr_set_d (y, 0.5, GMP_RNDN);
! 49: mpfr_set_d (z, 0.375, GMP_RNDN);
! 50: mpfr_fma (s, x, y, z, GMP_RNDU); /* result is 0 */
! 51:
! 52: mpfr_set_prec (x, 27);
! 53: mpfr_set_prec (y, 27);
! 54: mpfr_set_prec (z, 27);
! 55: mpfr_set_prec (s, 27);
! 56: mpfr_set_str_raw (x, "1.11111111111111111111111111e-1");
! 57: mpfr_set (y, x, GMP_RNDN);
! 58: mpfr_set_str_raw (z, "-1.00011110100011001011001001e-1");
! 59: if (mpfr_fma (s, x, y, z, GMP_RNDN) >= 0)
! 60: {
! 61: fprintf (stderr, "Wrong inexact flag for x=y=1-2^(-27)\n");
! 62: exit (1);
! 63: }
! 64:
! 65: MPFR_SET_NAN(x);
! 66: mpfr_random(y);
! 67: mpfr_random(z);
! 68: mpfr_fma (s,x, y,z, GMP_RNDN);
! 69: if(!MPFR_IS_NAN(s))
! 70: {
! 71: fprintf (stderr, "evaluation of function in x=NAN does not return NAN");
! 72: exit (1);
! 73: }
! 74:
! 75: MPFR_CLEAR_FLAGS(x);
! 76: MPFR_CLEAR_FLAGS(y);
! 77: MPFR_CLEAR_FLAGS(z);
! 78:
! 79: MPFR_SET_NAN(y);
! 80: mpfr_random(x);
! 81: mpfr_random(z);
! 82: mpfr_fma (s,x, y,z, GMP_RNDN);
! 83: if(!MPFR_IS_NAN(s))
! 84: {
! 85: printf ("evaluation of function in y=NAN does not return NAN");
! 86: exit (1);
! 87: }
! 88:
! 89: MPFR_CLEAR_FLAGS(x);
! 90: MPFR_CLEAR_FLAGS(y);
! 91: MPFR_CLEAR_FLAGS(z);
! 92:
! 93: MPFR_SET_NAN(z);
! 94: mpfr_random(y);
! 95: mpfr_random(x);
! 96: mpfr_fma (s,x, y,z, GMP_RNDN);
! 97: if(!MPFR_IS_NAN(s))
! 98: {
! 99: printf ("evaluation of function in z=NAN does not return NAN");
! 100: exit (1);
! 101: }
! 102:
! 103: MPFR_CLEAR_FLAGS(x);
! 104: MPFR_CLEAR_FLAGS(y);
! 105: MPFR_CLEAR_FLAGS(z);
! 106:
! 107: MPFR_SET_INF(x);
! 108: MPFR_SET_ZERO(y);
! 109: mpfr_random(z);
! 110: mpfr_fma (s,x, y,z, GMP_RNDN);
! 111: if(!MPFR_IS_NAN(s))
! 112: {
! 113: printf ("evaluation of function in x=INF y=0 does not return NAN");
! 114: exit (1);
! 115: }
! 116:
! 117: MPFR_CLEAR_FLAGS(z);
! 118: MPFR_CLEAR_FLAGS(y);
! 119: MPFR_CLEAR_FLAGS(x);
! 120:
! 121: MPFR_SET_INF(y);
! 122: MPFR_SET_ZERO(x);
! 123: mpfr_random(z);
! 124: mpfr_fma (s,x, y,z, GMP_RNDN);
! 125: if(!MPFR_IS_NAN(s))
! 126: {
! 127: printf ("evaluation of function in x=0 y=INF does not return NAN");
! 128: exit (1);
! 129: }
! 130:
! 131: MPFR_CLEAR_FLAGS(z);
! 132: MPFR_CLEAR_FLAGS(y);
! 133: MPFR_CLEAR_FLAGS(x);
! 134:
! 135: MPFR_SET_INF(x);
! 136: mpfr_random(y);
! 137: MPFR_SET_INF(z);
! 138: if((MPFR_SIGN(x) * MPFR_SIGN(y)) == MPFR_SIGN(z))
! 139: MPFR_CHANGE_SIGN(z);
! 140: mpfr_fma (s,x, y,z, GMP_RNDN);
! 141: if(!MPFR_IS_NAN(s))
! 142: {
! 143: printf ("evaluation of function in x=INF z=(-sign(x)*sign(y))INF does not return NAN");
! 144: exit (1);
! 145: }
! 146:
! 147: MPFR_CLEAR_FLAGS(z);
! 148: MPFR_CLEAR_FLAGS(y);
! 149: MPFR_CLEAR_FLAGS(x);
! 150:
! 151: MPFR_SET_INF(y);
! 152: mpfr_random(x);
! 153: MPFR_SET_INF(z);
! 154: if((MPFR_SIGN(x) * MPFR_SIGN(y)) == MPFR_SIGN(z))
! 155: MPFR_CHANGE_SIGN(z);
! 156:
! 157: mpfr_fma (s,x, y,z, GMP_RNDN);
! 158: if(!MPFR_IS_NAN(s))
! 159: {
! 160: printf ("evaluation of function in y=INF z=(-sign(x)*sign(y))INF does not return NAN");
! 161: exit (1);
! 162: }
! 163:
! 164: MPFR_CLEAR_FLAGS(z);
! 165: MPFR_CLEAR_FLAGS(y);
! 166: MPFR_CLEAR_FLAGS(x);
! 167:
! 168: MPFR_SET_INF(x);
! 169: mpfr_random(y);
! 170: mpfr_random(z);
! 171: mpfr_fma (s,x, y,z, GMP_RNDN);
! 172: if(!MPFR_IS_INF(s))
! 173: {
! 174: printf ("evaluation of function in x=INF does not return INF");
! 175: exit (1);
! 176: }
! 177:
! 178: MPFR_CLEAR_FLAGS(z);
! 179: MPFR_CLEAR_FLAGS(y);
! 180: MPFR_CLEAR_FLAGS(x);
! 181:
! 182: MPFR_SET_INF(y);
! 183: mpfr_random(x);
! 184: mpfr_random(z);
! 185: mpfr_fma (s,x, y,z, GMP_RNDN);
! 186: if(!MPFR_IS_INF(s))
! 187: {
! 188: printf ("evaluation of function in y=INF does not return INF");
! 189: exit (1);
! 190: }
! 191:
! 192: MPFR_CLEAR_FLAGS(z);
! 193: MPFR_CLEAR_FLAGS(y);
! 194: MPFR_CLEAR_FLAGS(x);
! 195:
! 196: MPFR_SET_INF(z);
! 197: mpfr_random(x);
! 198: mpfr_random(y);
! 199: mpfr_fma (s,x, y,z, GMP_RNDN);
! 200: if(!MPFR_IS_INF(s))
! 201: {
! 202: printf ("evaluation of function in z=INF does not return INF");
! 203: exit (1);
! 204: }
! 205:
! 206: MPFR_CLEAR_FLAGS(z);
! 207: MPFR_CLEAR_FLAGS(y);
! 208: MPFR_CLEAR_FLAGS(x);
! 209:
! 210: MPFR_SET_ZERO(x);
! 211: mpfr_random(y);
! 212: mpfr_random(z);
! 213: mpfr_fma (s,x, y,z, GMP_RNDN);
! 214: if(mpfr_cmp(s,z)!=0)
! 215: {
! 216: printf ("evaluation of function in x=0 does not return z\n");
! 217: exit (1);
! 218: }
! 219:
! 220: MPFR_CLEAR_FLAGS(z);
! 221: MPFR_CLEAR_FLAGS(y);
! 222: MPFR_CLEAR_FLAGS(x);
! 223:
! 224: MPFR_SET_ZERO(y);
! 225: mpfr_random(x);
! 226: mpfr_random(z);
! 227: mpfr_fma (s,x, y,z, GMP_RNDN);
! 228: if(mpfr_cmp(s,z)!=0)
! 229: {
! 230: printf ("evaluation of function in y=0 does not return z\n");
! 231: exit (1);
! 232: }
! 233:
! 234: MPFR_CLEAR_FLAGS(z);
! 235: MPFR_CLEAR_FLAGS(y);
! 236: MPFR_CLEAR_FLAGS(x);
! 237:
! 238: {
! 239: mp_prec_t prec;
! 240: mpfr_t t, slong;
! 241: mp_rnd_t rnd;
! 242: int inexact, compare;
! 243: unsigned int n;
! 244:
! 245: int p0=2;
! 246: int p1=200;
! 247: int N=200;
! 248:
! 249: mpfr_init (t);
! 250: mpfr_init (slong);
! 251:
! 252: /* generic test */
! 253: for (prec = p0; prec <= p1; prec++)
! 254: {
! 255: mpfr_set_prec (x, prec);
! 256: mpfr_set_prec (y, prec);
! 257: mpfr_set_prec (z, prec);
! 258: mpfr_set_prec (s, prec);
! 259: mpfr_set_prec (t, prec);
! 260:
! 261: for (n=0; n<N; n++)
! 262: {
! 263: mpfr_random (x);
! 264: mpfr_random (y);
! 265: mpfr_random (z);
! 266:
! 267: if (random() % 2)
! 268: mpfr_neg (x, x, GMP_RNDN);
! 269: if (random() % 2)
! 270: mpfr_neg (y, y, GMP_RNDN);
! 271: if (random() % 2)
! 272: mpfr_neg (z, z, GMP_RNDN);
! 273:
! 274: rnd = random () % 4;
! 275: mpfr_set_prec (slong, 2 * prec);
! 276: if (mpfr_mul (slong, x, y, rnd))
! 277: {
! 278: fprintf (stderr, "x*y should be exact\n");
! 279: exit (1);
! 280: }
! 281: compare = mpfr_add (t, slong, z, rnd);
! 282: inexact = mpfr_fma (s, x, y, z, rnd);
! 283: if (mpfr_cmp (s, t))
! 284: {
! 285: printf ("results differ for x=");
! 286: mpfr_out_str (stdout, 2, prec, x, GMP_RNDN);
! 287: printf (" y=");
! 288: mpfr_out_str (stdout, 2, prec, y, GMP_RNDN);
! 289: printf (" z=");
! 290: mpfr_out_str (stdout, 2, prec, z, GMP_RNDN);
! 291: printf (" prec=%u rnd_mode=%s\n", (unsigned) prec,
! 292: mpfr_print_rnd_mode (rnd));
! 293: printf ("got ");
! 294: mpfr_out_str (stdout, 2, prec, s, GMP_RNDN);
! 295: putchar ('\n');
! 296: printf ("expected ");
! 297: mpfr_out_str (stdout, 2, prec, t, GMP_RNDN);
! 298: putchar ('\n');
! 299: printf ("approx ");
! 300: mpfr_print_binary (slong);
! 301: putchar ('\n');
! 302: exit (1);
! 303: }
! 304: if (((inexact == 0) && (compare != 0)) ||
! 305: ((inexact < 0) && (compare >= 0)) ||
! 306: ((inexact > 0) && (compare <= 0)))
! 307: {
! 308: fprintf (stderr, "Wrong inexact flag for rnd=%s: expected %d, got %d\n",
! 309: mpfr_print_rnd_mode (rnd), compare, inexact);
! 310: fprintf (stderr, "x="); mpfr_out_str (stderr, 2, 0, x, GMP_RNDN);
! 311: fprintf (stderr, " y="); mpfr_out_str (stderr, 2, 0, y, GMP_RNDN);
! 312: fprintf (stderr, " z="); mpfr_out_str (stderr, 2, 0, z, GMP_RNDN);
! 313: fprintf (stderr, " s="); mpfr_out_str (stderr, 2, 0, s, GMP_RNDN);
! 314: fprintf (stderr, "\n");
! 315: fprintf (stderr, "z=%1.20e s=%1.20e\n", mpfr_get_d1 (z),
! 316: mpfr_get_d1 (s));
! 317: exit (1);
! 318: }
! 319: }
! 320: }
! 321: mpfr_clear (t);
! 322: mpfr_clear (slong);
! 323:
! 324: }
! 325: mpfr_clear (x);
! 326: mpfr_clear (y);
! 327: mpfr_clear (z);
! 328: mpfr_clear (s);
! 329:
! 330: return 0;
! 331: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>