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

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

1.1     ! ohara       1: /* Test file for mpfr_agm.
        !             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 <math.h>
        !            23: #include <stdio.h>
        !            24: #include <stdlib.h>
        !            25: #include <time.h>
        !            26: #include "gmp.h"
        !            27: #include "mpfr.h"
        !            28: #include "mpfr-test.h"
        !            29:
        !            30: double drand_agm _PROTO((void));
        !            31: double dagm _PROTO((double, double));
        !            32: void check4 _PROTO((double, double, mp_rnd_t, double));
        !            33: void check_large _PROTO((void));
        !            34: void slave _PROTO((int, int));
        !            35:
        !            36: double
        !            37: drand_agm (void)
        !            38: {
        !            39:   double d; long int *i;
        !            40:
        !            41:   i = (long int*) &d;
        !            42:   do {
        !            43:     i[0] = LONG_RAND();
        !            44:     i[1] = LONG_RAND();
        !            45:   } while ((d<1e-153)||(d>1e153));    /* to avoid underflow or overflow
        !            46:                                         in double calculus in sqrt(u*v) */
        !            47:
        !            48:   return d;
        !            49: }
        !            50:
        !            51: double
        !            52: dagm (double a, double b)
        !            53: {
        !            54:   double u, v, tmpu, tmpv;
        !            55:
        !            56:   if ((isnan(a))||(isnan(b)))
        !            57:     return a+b;
        !            58:
        !            59:   tmpv=MAX(a,b);
        !            60:   tmpu=MIN(a,b);
        !            61:
        !            62:   do
        !            63:     {
        !            64:       u=tmpu;
        !            65:       v=tmpv;
        !            66:       tmpu=sqrt(u*v);
        !            67:       tmpv=(u+v)/2.0;
        !            68:     }
        !            69:   while (!(((tmpu==u)&&(tmpv==v))||(ulp(u,v)==0)));
        !            70:
        !            71:   /*  printf("difference : %i ulp\n",ulp(u,v)); */
        !            72:         return u;
        !            73: }
        !            74:
        !            75: #define check(a,b,r) check4(a,b,r,0.0)
        !            76:
        !            77: void
        !            78: check4 (double a, double b, mp_rnd_t rnd_mode, double res1)
        !            79: {
        !            80:   mpfr_t ta, tb, tres;
        !            81:   double res2;
        !            82:   int ck=0;
        !            83:
        !            84:   mpfr_init2(ta, 53);
        !            85:   mpfr_init2(tb, 53);
        !            86:   mpfr_init2(tres, 53);
        !            87:
        !            88:   mpfr_set_d(ta, a, rnd_mode);
        !            89:   mpfr_set_d(tb, b, rnd_mode);
        !            90:
        !            91:   mpfr_agm(tres, ta, tb, rnd_mode);
        !            92: #ifdef MPFR_HAVE_FESETROUND
        !            93:   mpfr_set_machine_rnd_mode(rnd_mode);
        !            94: #endif
        !            95:
        !            96:   if (res1==0.0) res1=dagm(a,b); else ck=1;
        !            97: if (ck==0) printf("%1.20e\n", res1);
        !            98:   res2 = mpfr_get_d1 (tres);
        !            99:
        !           100:   if (ck && res1!=res2 && (!isnan(res1) || !isnan(res2))) {
        !           101:     printf("mpfr_agm failed for a=%1.20e, b=%1.20e, rnd_mode=%d\n",a,b,rnd_mode);
        !           102:     printf("expected result is %1.20e, got %1.20e (%d ulp)\n",res1,res2,
        !           103:           ulp(res2,res1));
        !           104:     /*exit(1);*/
        !           105:   }
        !           106:   mpfr_clear(ta); mpfr_clear(tb); mpfr_clear(tres);
        !           107: }
        !           108:
        !           109: void
        !           110: check_large (void)
        !           111: {
        !           112:   mpfr_t a, b, agm;
        !           113:
        !           114:   mpfr_init2(a, 82); mpfr_init2(b, 82); mpfr_init2(agm, 82);
        !           115:   mpfr_set_ui(a, 1, GMP_RNDN);
        !           116:   mpfr_set_str_raw(b, "0.1111101100001000000001011000110111101000001011111000100001000101010100011111110010E-39");
        !           117:   mpfr_agm(agm, a, b, GMP_RNDN);
        !           118:   mpfr_set_str_raw(a, "0.1110001000111101101010101010101101001010001001001011100101111011110101111001111100E-4");
        !           119:   if (mpfr_cmp(agm, a)) {
        !           120:     fprintf(stderr, "mpfr_agm failed for precision 82\n"); exit(1);
        !           121:   }
        !           122:   mpfr_clear(a); mpfr_clear(b); mpfr_clear(agm);
        !           123: }
        !           124:
        !           125: void
        !           126: slave (int N, int p)
        !           127: {
        !           128:   int i;
        !           129:   double a,b;
        !           130:   mpfr_t ta, tb, tres;
        !           131:
        !           132:   mpfr_init2(ta, 53);
        !           133:   mpfr_init2(tb, 53);
        !           134:   mpfr_init2(tres, p);
        !           135:   for(i=0;i<N;i++) {
        !           136:     a = drand_agm();
        !           137:     b = drand_agm();
        !           138:     mpfr_set_d(ta, a, GMP_RNDN);
        !           139:     mpfr_set_d(tb, b, GMP_RNDN);
        !           140:     mpfr_agm(tres, ta, tb, LONG_RAND() % 4 );
        !           141:   }
        !           142:     mpfr_clear(ta); mpfr_clear(ta); mpfr_clear(tres);
        !           143:     printf("fin\n");
        !           144: }
        !           145:
        !           146:
        !           147: int
        !           148: main (int argc, char* argv[])
        !           149: {
        !           150:    int N;
        !           151:
        !           152:    SEED_RAND (time(NULL));
        !           153:
        !           154:    if (argc==3) {   /* tagm N p : N calculus with precision p*/
        !           155:      printf("Doing %d random tests in %d precision\n",atoi(argv[1]),atoi(argv[2]));
        !           156:      slave(atoi(argv[1]),atoi(argv[2]));
        !           157:      return 0;
        !           158:    }
        !           159:
        !           160:    if (argc==2) { /* tagm N: N tests with random double's */
        !           161:      int i;
        !           162:      double a,b;
        !           163:
        !           164:      N = atoi(argv[1]);
        !           165:      for (i=0;i<N;i++) {
        !           166:        a = drand();
        !           167:        b = drand();
        !           168:        check(a, b, LONG_RAND() % 4);
        !           169:      }
        !           170:      return 0;
        !           171:    }
        !           172:    else {
        !           173:      check_large();
        !           174:      check4(2.0, 1.0, GMP_RNDN, 1.45679103104690677029);
        !           175:      check4(6.0, 4.0, GMP_RNDN, 4.94936087247260925182);
        !           176:      check4(62.0, 61.0, GMP_RNDN, 6.14989837188450749750e+01);
        !           177:      check4(0.5, 1.0, GMP_RNDN, 7.28395515523453385143e-01);
        !           178:      check4(1.0, 2.0, GMP_RNDN, 1.45679103104690677029);
        !           179:      check4(234375765.0, 234375000.0, GMP_RNDN, 2.3437538249984395504e8);
        !           180:      check4(8.0, 1.0, GMP_RNDU, 3.615756177597362786);
        !           181:      check4(1.0, 44.0, GMP_RNDU, 1.33658354512981247808e1);
        !           182:      check4(1.0, 3.7252902984619140625e-9, GMP_RNDU, 7.55393356971199025907e-02);
        !           183:    }
        !           184:
        !           185:    /* TODO : tests des infinis dans tagm.c */
        !           186:
        !           187:    return 0;
        !           188: }

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