[BACK]Return to tdiv.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpfr / tests

Annotation of OpenXM_contrib/gmp/mpfr/tests/tdiv.c, Revision 1.1

1.1     ! ohara       1: /* Test file for mpfr_div.
        !             2:
        !             3: Copyright 1999, 2001, 2002 Free Software Foundation, Inc.
        !             4:
        !             5: This file is part of the MPFR Library.
        !             6:
        !             7: The MPFR Library is free software; you can redistribute it and/or modify
        !             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
        !            10: option) any later version.
        !            11:
        !            12: The MPFR Library is distributed in the hope that it will be useful, but
        !            13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
        !            15: License for more details.
        !            16:
        !            17: You should have received a copy of the GNU Lesser General Public License
        !            18: along with the MPFR 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 <stdio.h>
        !            23: #include <stdlib.h>
        !            24: #include <time.h>
        !            25: #include "gmp.h"
        !            26: #include "gmp-impl.h"
        !            27: #include "mpfr.h"
        !            28: #include "mpfr-impl.h"
        !            29: #include "mpfr-test.h"
        !            30:
        !            31: #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
        !            32:
        !            33: void check4 _PROTO((double, double, mp_rnd_t, int, double));
        !            34: void check24 _PROTO((float, float, mp_rnd_t, float));
        !            35: void check_float _PROTO((void));
        !            36: void check_convergence _PROTO((void));
        !            37: void check_lowr _PROTO((void));
        !            38: void check_inexact _PROTO((void));
        !            39: void check_nan _PROTO((void));
        !            40:
        !            41: void
        !            42: check4 (double N, double D, mp_rnd_t rnd_mode, int p, double Q)
        !            43: {
        !            44:   mpfr_t q, n, d; double Q2;
        !            45:
        !            46:   mpfr_init2(q, p); mpfr_init2(n, p); mpfr_init2(d, p);
        !            47:   mpfr_set_d(n, N, rnd_mode);
        !            48:   mpfr_set_d(d, D, rnd_mode);
        !            49:   mpfr_div(q, n, d, rnd_mode);
        !            50: #ifdef MPFR_HAVE_FESETROUND
        !            51:   mpfr_set_machine_rnd_mode(rnd_mode);
        !            52: #endif
        !            53:   if (Q==0.0) Q = N/D;
        !            54:   Q2 = mpfr_get_d1 (q);
        !            55:   if (p==53 && Q!=Q2 && (!isnan(Q) || !isnan(Q2))) {
        !            56:     printf("mpfr_div failed for n=%1.20e, d=%1.20e, rnd_mode=%s\n",
        !            57:           N, D, mpfr_print_rnd_mode(rnd_mode));
        !            58:     printf("expected quotient is %1.20e, got %1.20e (%d ulp)\n", Q, Q2,
        !            59:           ulp(Q2, Q));
        !            60:     exit(1);
        !            61:   }
        !            62:   mpfr_clear(q); mpfr_clear(n); mpfr_clear(d);
        !            63: }
        !            64:
        !            65: void
        !            66: check24 (float N, float D, mp_rnd_t rnd_mode, float Q)
        !            67: {
        !            68:   mpfr_t q, n, d; float Q2;
        !            69:
        !            70:   mpfr_init2(q, 24); mpfr_init2(n, 24); mpfr_init2(d, 24);
        !            71:   mpfr_set_d(n, N, rnd_mode);
        !            72:   mpfr_set_d(d, D, rnd_mode);
        !            73:   mpfr_div(q, n, d, rnd_mode);
        !            74:   Q2 = mpfr_get_d1 (q);
        !            75:   if (Q!=Q2) {
        !            76:     printf("mpfr_div failed for n=%1.10e, d=%1.10e, prec=24, rnd_mode=%s\n",
        !            77:           N, D, mpfr_print_rnd_mode(rnd_mode));
        !            78:     printf("expected quotient is %1.10e, got %1.10e\n", Q, Q2);
        !            79:     exit(1);
        !            80:   }
        !            81:   mpfr_clear(q); mpfr_clear(n); mpfr_clear(d);
        !            82: }
        !            83:
        !            84: /* the following examples come from the paper "Number-theoretic Test
        !            85:    Generation for Directed Rounding" from Michael Parks, Table 2 */
        !            86: void
        !            87: check_float(void)
        !            88: {
        !            89:   float b=8388608.0; /* 2^23 */
        !            90:
        !            91:   check24(b*8388610.0, 8388609.0, GMP_RNDN, 8.388609e6);
        !            92:   check24(b*16777215.0, 16777213.0, GMP_RNDN, 8.388609e6);
        !            93:   check24(b*8388612.0, 8388611.0, GMP_RNDN, 8.388609e6);
        !            94:   check24(b*12582914.0, 12582911.0, GMP_RNDN, 8.38861e6);
        !            95:   check24(12582913.0, 12582910.0, GMP_RNDN, 1.000000238);
        !            96:   check24(b*16777215.0, 8388609.0, GMP_RNDN, 1.6777213e7);
        !            97:   check24(b*8388612.0, 8388609.0, GMP_RNDN, 8.388611e6);
        !            98:   check24(b*12582914.0, 8388610.0, GMP_RNDN, 1.2582911e7);
        !            99:   check24(b*12582913.0, 8388610.0, GMP_RNDN, 1.258291e7);
        !           100:
        !           101:   check24(b*8388610.0, 8388609.0, GMP_RNDZ, 8.388608e6);
        !           102:   check24(b*16777215.0, 16777213.0, GMP_RNDZ, 8.388609e6);
        !           103:   check24(b*8388612.0, 8388611.0, GMP_RNDZ, 8.388608e6);
        !           104:   check24(b*12582914.0, 12582911.0, GMP_RNDZ, 8.38861e6);
        !           105:   check24(12582913.0, 12582910.0, GMP_RNDZ, 1.000000238);
        !           106:   check24(b*16777215.0, 8388609.0, GMP_RNDZ, 1.6777213e7);
        !           107:   check24(b*8388612.0, 8388609.0, GMP_RNDZ, 8.38861e6);
        !           108:   check24(b*12582914.0, 8388610.0, GMP_RNDZ, 1.2582911e7);
        !           109:   check24(b*12582913.0, 8388610.0, GMP_RNDZ, 1.258291e7);
        !           110:
        !           111:   check24(b*8388610.0, 8388609.0, GMP_RNDU, 8.388609e6);
        !           112:   check24(b*16777215.0, 16777213.0, GMP_RNDU, 8.38861e6);
        !           113:   check24(b*8388612.0, 8388611.0, GMP_RNDU, 8.388609e6);
        !           114:   check24(b*12582914.0, 12582911.0, GMP_RNDU, 8.388611e6);
        !           115:   check24(12582913.0, 12582910.0, GMP_RNDU, 1.000000357);
        !           116:   check24(b*16777215.0, 8388609.0, GMP_RNDU, 1.6777214e7);
        !           117:   check24(b*8388612.0, 8388609.0, GMP_RNDU, 8.388611e6);
        !           118:   check24(b*12582914.0, 8388610.0, GMP_RNDU, 1.2582912e7);
        !           119:   check24(b*12582913.0, 8388610.0, GMP_RNDU, 1.2582911e7);
        !           120:
        !           121:   check24(b*8388610.0, 8388609.0, GMP_RNDD, 8.388608e6);
        !           122:   check24(b*16777215.0, 16777213.0, GMP_RNDD, 8.388609e6);
        !           123:   check24(b*8388612.0, 8388611.0, GMP_RNDD, 8.388608e6);
        !           124:   check24(b*12582914.0, 12582911.0, GMP_RNDD, 8.38861e6);
        !           125:   check24(12582913.0, 12582910.0, GMP_RNDD, 1.000000238);
        !           126:   check24(b*16777215.0, 8388609.0, GMP_RNDD, 1.6777213e7);
        !           127:   check24(b*8388612.0, 8388609.0, GMP_RNDD, 8.38861e6);
        !           128:   check24(b*12582914.0, 8388610.0, GMP_RNDD, 1.2582911e7);
        !           129:   check24(b*12582913.0, 8388610.0, GMP_RNDD, 1.258291e7);
        !           130: }
        !           131:
        !           132: void
        !           133: check_convergence (void)
        !           134: {
        !           135:   mpfr_t x, y; int i, j;
        !           136:
        !           137:   mpfr_init2(x, 130);
        !           138:   mpfr_set_str_raw(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
        !           139:   mpfr_init2(y, 130);
        !           140:   mpfr_set_ui(y, 5, GMP_RNDN);
        !           141:   mpfr_div(x, x, y, GMP_RNDD); /* exact division */
        !           142:
        !           143:   mpfr_set_prec(x, 64);
        !           144:   mpfr_set_prec(y, 64);
        !           145:   mpfr_set_str_raw(x, "0.10010010011011010100101001010111100000101110010010101E55");
        !           146:   mpfr_set_str_raw(y, "0.1E585");
        !           147:   mpfr_div(x, x, y, GMP_RNDN);
        !           148:   mpfr_set_str_raw(y, "0.10010010011011010100101001010111100000101110010010101E-529");
        !           149:   if (mpfr_cmp(x, y)) {
        !           150:     fprintf(stderr, "Error in mpfr_div for prec=64, rnd=GMP_RNDN\n");
        !           151:     printf("got        "); mpfr_print_binary(x); putchar('\n');
        !           152:     printf("instead of "); mpfr_print_binary(y); putchar('\n');
        !           153:     exit(1);
        !           154:   }
        !           155:
        !           156:   for (i=32; i<=64; i+=32) {
        !           157:       mpfr_set_prec(x, i);
        !           158:       mpfr_set_prec(y, i);
        !           159:       mpfr_set_d(x, 1.0, GMP_RNDN);
        !           160:       for (j=0;j<4;j++) {
        !           161:        mpfr_set_d(y, 1.0, GMP_RNDN);
        !           162:        mpfr_div(y, x, y, j);
        !           163:        if (mpfr_cmp_ui(y, 1)) {
        !           164:          fprintf(stderr, "mpfr_div failed for x=1.0, y=1.0, prec=%u rnd=%s\n",
        !           165:                  i, mpfr_print_rnd_mode(j));
        !           166:          printf("got "); mpfr_print_binary(y); putchar('\n');
        !           167:          exit(1);
        !           168:        }
        !           169:       }
        !           170:   }
        !           171:
        !           172:   mpfr_clear(x); mpfr_clear(y);
        !           173: }
        !           174:
        !           175: void
        !           176: check_lowr (void)
        !           177: {
        !           178:   mpfr_t x, y, z, z2, z3, tmp;
        !           179:   int k, c;
        !           180:
        !           181:
        !           182:   mpfr_init2 (x, 1000);
        !           183:   mpfr_init2 (y, 100);
        !           184:   mpfr_init2 (tmp, 850);
        !           185:   mpfr_init2 (z, 10);
        !           186:   mpfr_init2 (z2, 10);
        !           187:   mpfr_init2 (z3, 50);
        !           188:
        !           189:   for (k = 1; k < 10000; k++)
        !           190:     {
        !           191:       mpfr_random (z);
        !           192:       mpfr_random (tmp);
        !           193:       mpfr_mul (x, z, tmp, GMP_RNDN);
        !           194:       c = mpfr_div (z2, x, tmp, GMP_RNDN);
        !           195:
        !           196:       if (c || mpfr_cmp(z2, z))
        !           197:        {
        !           198:          fprintf(stderr, "Error in mpfr_div rnd=GMP_RNDN\n");
        !           199:          printf("Dividing ");
        !           200:          printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           201:          printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           202:          printf("inex flag = %d\n", c);
        !           203:          exit(1);
        !           204:        }
        !           205:     }
        !           206:
        !           207:   mpfr_set_prec(z2, 9);
        !           208:   for (k = 1; k < 10000; k++)
        !           209:     {
        !           210:       mpfr_random(z);
        !           211:       mpfr_random(tmp);
        !           212:       mpfr_mul(x, z, tmp, GMP_RNDN);
        !           213:       c = mpfr_div(z2, x, tmp, GMP_RNDN);
        !           214:
        !           215:       if ((mpfr_cmp(z2, z) == 0 && c) || c == -1)
        !           216:        {
        !           217:          fprintf(stderr, "Error in mpfr_div rnd=GMP_RNDN\n");
        !           218:          printf("Dividing ");
        !           219:          printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           220:          printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           221:          printf("inex flag = %d\n", c);
        !           222:          exit(1);
        !           223:        }
        !           224:       else if (c == 2)
        !           225:        {
        !           226:          mpfr_add_one_ulp(z, GMP_RNDN);
        !           227:          if (mpfr_cmp(z2, z))
        !           228:            {
        !           229:              fprintf(stderr, "Error in mpfr_div [even rnd?] rnd=GMP_RNDN\n");
        !           230:              printf("Dividing ");
        !           231:              printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           232:              printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           233:              printf("inex flag = %d\n", 1);
        !           234:              exit(1);
        !           235:            }
        !           236:        }
        !           237:       else if (c == -2)
        !           238:        {
        !           239:          mpfr_sub_one_ulp(z, GMP_RNDN);
        !           240:          if (mpfr_cmp(z2, z))
        !           241:            {
        !           242:              fprintf(stderr, "Error in mpfr_div [even rnd?] rnd=GMP_RNDN\n");
        !           243:              printf("Dividing ");
        !           244:              printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           245:              printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           246:              printf("inex flag = %d\n", 1);
        !           247:              exit(1);
        !           248:            }
        !           249:        }
        !           250:     }
        !           251:
        !           252:
        !           253:   mpfr_set_prec(x, 1000);
        !           254:   mpfr_set_prec(y, 100);
        !           255:   mpfr_set_prec(tmp, 850);
        !           256:   mpfr_set_prec(z, 10);
        !           257:   mpfr_set_prec(z2, 10);
        !           258:
        !           259:   /* almost exact divisions */
        !           260:   for (k = 1; k < 10000; k++)
        !           261:     {
        !           262:       mpfr_random(z);
        !           263:       mpfr_random(tmp);
        !           264:       mpfr_mul(x, z, tmp, GMP_RNDN);
        !           265:       mpfr_set(y, tmp, GMP_RNDD);
        !           266:       mpfr_add_one_ulp(x, GMP_RNDN);
        !           267:
        !           268:       c = mpfr_div(z2, x, y, GMP_RNDD);
        !           269:       mpfr_div(z3, x, y, GMP_RNDD);
        !           270:       mpfr_set(z, z3, GMP_RNDD);
        !           271:
        !           272:       if (c != -1 || mpfr_cmp(z2, z))
        !           273:        {
        !           274:          fprintf(stderr, "Error in mpfr_div rnd=GMP_RNDD\n");
        !           275:          printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           276:          printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           277:          printf("inex flag = %d\n", c);
        !           278:          exit(1);
        !           279:        }
        !           280:
        !           281:       mpfr_set(y, tmp, GMP_RNDU);
        !           282:       c = mpfr_div(z2, x, y, GMP_RNDU);
        !           283:       mpfr_div(z3, x, y, GMP_RNDU);
        !           284:       mpfr_set(z, z3, GMP_RNDU);
        !           285:       if (c != 1 || mpfr_cmp(z2, z))
        !           286:        {
        !           287:          fprintf(stderr, "Error in mpfr_div rnd=GMP_RNDU\n");
        !           288:          printf("got        "); mpfr_print_binary(z2); putchar('\n');
        !           289:          printf("instead of "); mpfr_print_binary(z); putchar('\n');
        !           290:          printf("inex flag = %d\n", c);
        !           291:          exit(1);
        !           292:        }
        !           293:     }
        !           294:
        !           295:   mpfr_clear (x);
        !           296:   mpfr_clear (y);
        !           297:   mpfr_clear (z);
        !           298:   mpfr_clear (z2);
        !           299:   mpfr_clear (z3);
        !           300:   mpfr_clear (tmp);
        !           301: }
        !           302:
        !           303: #define MAX_PREC 100
        !           304:
        !           305: void
        !           306: check_inexact (void)
        !           307: {
        !           308:   mpfr_t x, y, z, u;
        !           309:   mp_prec_t px, py, pu;
        !           310:   int inexact, cmp;
        !           311:   mp_rnd_t rnd;
        !           312:
        !           313:   mpfr_init (x);
        !           314:   mpfr_init (y);
        !           315:   mpfr_init (z);
        !           316:   mpfr_init (u);
        !           317:
        !           318:   mpfr_set_prec (x, 33);
        !           319:   mpfr_set_str_raw (x, "0.101111100011011101010011101100001E0");
        !           320:   mpfr_set_prec (u, 2);
        !           321:   mpfr_set_str_raw (u, "0.1E0");
        !           322:   mpfr_set_prec (y, 28);
        !           323:   if ((inexact = mpfr_div (y, x, u, GMP_RNDN) >= 0))
        !           324:     {
        !           325:       fprintf (stderr, "Wrong inexact flag (1): expected -1, got %d\n",
        !           326:               inexact);
        !           327:       exit (1);
        !           328:     }
        !           329:
        !           330:   mpfr_set_prec (x, 129);
        !           331:   mpfr_set_str_raw (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
        !           332:   mpfr_set_prec (u, 15);
        !           333:   mpfr_set_str_raw (u, "0.101101000001100E-1");
        !           334:   mpfr_set_prec (y, 92);
        !           335:   if ((inexact = mpfr_div (y, x, u, GMP_RNDN) <= 0))
        !           336:     {
        !           337:       fprintf (stderr, "Wrong inexact flag (1): expected 1, got %d\n",
        !           338:               inexact);
        !           339:       mpfr_print_binary(y); putchar('\n');
        !           340:       exit (1);
        !           341:     }
        !           342:
        !           343:   for (px=2; px<MAX_PREC; px++)
        !           344:     {
        !           345:       mpfr_set_prec (x, px);
        !           346:       mpfr_random (x);
        !           347:       for (pu=2; pu<=MAX_PREC; pu++)
        !           348:        {
        !           349:          mpfr_set_prec (u, pu);
        !           350:          do { mpfr_random (u); } while (mpfr_cmp_ui (u, 0) == 0);
        !           351:          for (py=2; py<=MAX_PREC; py++)
        !           352:            {
        !           353:              mpfr_set_prec (y, py);
        !           354:              mpfr_set_prec (z, py + pu);
        !           355:              for (rnd=0; rnd<4; rnd++)
        !           356:                {
        !           357:                  inexact = mpfr_div (y, x, u, rnd);
        !           358:                  if (mpfr_mul (z, y, u, rnd))
        !           359:                    {
        !           360:                      fprintf (stderr, "z <- y * u should be exact\n");
        !           361:                      exit (1);
        !           362:                    }
        !           363:                  cmp = mpfr_cmp (z, x);
        !           364:                  if (((inexact == 0) && (cmp != 0)) ||
        !           365:                      ((inexact > 0) && (cmp <= 0)) ||
        !           366:                      ((inexact < 0) && (cmp >= 0)))
        !           367:                    {
        !           368:                      fprintf (stderr, "Wrong inexact flag for rnd=%s\n",
        !           369:                           mpfr_print_rnd_mode(rnd));
        !           370:                      printf ("expected %d, got %d\n", cmp, inexact);
        !           371:                      printf ("x="); mpfr_print_binary (x); putchar ('\n');
        !           372:                      printf ("u="); mpfr_print_binary (u); putchar ('\n');
        !           373:                      printf ("y="); mpfr_print_binary (y); putchar ('\n');
        !           374:                      printf ("y*u="); mpfr_print_binary (z); putchar ('\n');
        !           375:                      exit (1);
        !           376:                    }
        !           377:                }
        !           378:            }
        !           379:        }
        !           380:     }
        !           381:
        !           382:   mpfr_clear (x);
        !           383:   mpfr_clear (y);
        !           384:   mpfr_clear (z);
        !           385:   mpfr_clear (u);
        !           386: }
        !           387:
        !           388: void
        !           389: check_nan (void)
        !           390: {
        !           391:   mpfr_t  a, d, q;
        !           392:
        !           393:   mpfr_init2 (a, 100L);
        !           394:   mpfr_init2 (d, 100L);
        !           395:   mpfr_init2 (q, 100L);
        !           396:
        !           397:   /* 1/nan == nan */
        !           398:   mpfr_set_ui (a, 1L, GMP_RNDN);
        !           399:   MPFR_SET_NAN (d);
        !           400:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           401:   ASSERT_ALWAYS (mpfr_nan_p (q));
        !           402:
        !           403:   /* nan/1 == nan */
        !           404:   MPFR_SET_NAN (a);
        !           405:   mpfr_set_ui (d, 1L, GMP_RNDN);
        !           406:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           407:   ASSERT_ALWAYS (mpfr_nan_p (q));
        !           408:
        !           409:   /* +inf/1 == +inf */
        !           410:   MPFR_CLEAR_FLAGS (a);
        !           411:   MPFR_SET_INF (a);
        !           412:   MPFR_SET_POS (a);
        !           413:   mpfr_set_ui (d, 1L, GMP_RNDN);
        !           414:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           415:   ASSERT_ALWAYS (mpfr_inf_p (q));
        !           416:   ASSERT_ALWAYS (mpfr_sgn (q) > 0);
        !           417:
        !           418:   /* 1/+inf == 0 */
        !           419:   mpfr_set_ui (a, 1L, GMP_RNDN);
        !           420:   MPFR_CLEAR_FLAGS (d);
        !           421:   MPFR_SET_INF (d);
        !           422:   MPFR_SET_POS (d);
        !           423:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           424:   ASSERT_ALWAYS (mpfr_number_p (q));
        !           425:   ASSERT_ALWAYS (mpfr_sgn (q) == 0);
        !           426:
        !           427:   /* 0/0 == nan */
        !           428:   mpfr_set_ui (a, 0L, GMP_RNDN);
        !           429:   mpfr_set_ui (d, 0L, GMP_RNDN);
        !           430:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           431:   ASSERT_ALWAYS (mpfr_nan_p (q));
        !           432:
        !           433:   /* +inf/+inf == nan */
        !           434:   MPFR_CLEAR_FLAGS (a);
        !           435:   MPFR_SET_INF (a);
        !           436:   MPFR_SET_POS (a);
        !           437:   MPFR_CLEAR_FLAGS (d);
        !           438:   MPFR_SET_INF (d);
        !           439:   MPFR_SET_POS (d);
        !           440:   ASSERT_ALWAYS (mpfr_div (q, a, d, GMP_RNDZ) == 0); /* exact */
        !           441:   ASSERT_ALWAYS (mpfr_nan_p (q));
        !           442:
        !           443:   mpfr_clear (a);
        !           444:   mpfr_clear (d);
        !           445:   mpfr_clear (q);
        !           446: }
        !           447:
        !           448:
        !           449: int
        !           450: main (int argc, char *argv[])
        !           451: {
        !           452:   mpfr_t x, y, z;
        !           453:
        !           454: #ifdef MPFR_HAVE_FESETROUND
        !           455:   int N, i;
        !           456:   double n, d, e;
        !           457:
        !           458:   mpfr_test_init ();
        !           459: #endif
        !           460:
        !           461:   check_inexact();
        !           462:
        !           463:   mpfr_init2 (x, 64);
        !           464:   mpfr_init2 (y, 64);
        !           465:   mpfr_init2 (z, 64);
        !           466:
        !           467:   mpfr_set_str_raw(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
        !           468:   mpfr_set_str_raw(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
        !           469:   mpfr_div(z, x, y, GMP_RNDU);
        !           470:
        !           471:   check_nan ();
        !           472:   check_lowr();
        !           473:   check_float(); /* checks single precision */
        !           474:   check_convergence();
        !           475:   check53(0.0, 1.0, GMP_RNDZ, 0.0);
        !           476:   check53(-7.4988969224688591e63, 4.8816866450288732e306, GMP_RNDD,
        !           477:          -1.5361282826510687291e-243);
        !           478:   check53(-1.33225773037748601769e+199, 3.63449540676937123913e+79, GMP_RNDZ,
        !           479:          -3.6655920045905428978e119);
        !           480:   check4(4.0, 4.503599627370496e15, GMP_RNDZ, 62, 0.0);
        !           481:   check4(1.0, 2.10263340267725788209e+187, GMP_RNDU, 65, 0.0);
        !           482:   check4(2.44394909079968374564e-150, 2.10263340267725788209e+187, GMP_RNDU,
        !           483:         65, 0.0);
        !           484:   check53(9.89438396044940256501e-134, 5.93472984109987421717e-67, GMP_RNDU,
        !           485:          1.6672003992376663654e-67);
        !           486:   check53(9.89438396044940256501e-134, -5.93472984109987421717e-67, GMP_RNDU,
        !           487:          -1.6672003992376663654e-67);
        !           488:   check53(-4.53063926135729747564e-308, 7.02293374921793516813e-84, GMP_RNDD,
        !           489:          -6.4512060388748850857e-225);
        !           490:   check53(6.25089225176473806123e-01, -2.35527154824420243364e-230, GMP_RNDD,
        !           491:          -2.6540006635008291192e229);
        !           492:   check53(6.52308934689126e15, -1.62063546601505417497e273, GMP_RNDN,
        !           493:          -4.0250194961676020848e-258);
        !           494:   check53(1.04636807108079349236e-189, 3.72295730823253012954e-292, GMP_RNDZ,
        !           495:          2.810583051186143125e102);
        !           496:
        !           497: #ifdef MPFR_HAVE_FESETROUND
        !           498:   N = (argc>1) ? atoi(argv[1]) : 10000;
        !           499:   SEED_RAND (time(NULL));
        !           500:   for (i=0;i<N;i++)
        !           501:     {
        !           502:       do { n = drand(); d = drand(); e = ABS(n)/ABS(d); }
        !           503:       /* smallest normalized is 2^(-1022), largest is 2^(1023)*(2-2^(-52)) */
        !           504:       while (e>=MAXNORM || e<MINNORM);
        !           505:       check4 (n, d, LONG_RAND() % 4, 53, 0.0);
        !           506:     }
        !           507: #endif
        !           508:
        !           509:   mpfr_clear (x);
        !           510:   mpfr_clear (y);
        !           511:   mpfr_clear (z);
        !           512:
        !           513:   return 0;
        !           514: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>