Hex Artifact Content
Not logged in

Artifact b73c51eac0dd7f1bfe6517a517d0cf45b83eb4bf:


0000: 2f 2a 20 54 65 73 74 20 66 69 6c 65 20 66 6f 72  /* Test file for
0010: 20 6d 70 66 72 5f 73 65 74 5f 71 2e 0a 0a 43 6f   mpfr_set_q...Co
0020: 70 79 72 69 67 68 74 20 32 30 30 30 2c 20 32 30  pyright 2000, 20
0030: 30 31 2c 20 32 30 30 32 20 46 72 65 65 20 53 6f  01, 2002 Free So
0040: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
0050: 6e 2c 20 49 6e 63 2e 0a 0a 54 68 69 73 20 66 69  n, Inc...This fi
0060: 6c 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  le is part of th
0070: 65 20 4d 50 46 52 20 4c 69 62 72 61 72 79 2e 0a  e MPFR Library..
0080: 0a 54 68 65 20 4d 50 46 52 20 4c 69 62 72 61 72  .The MPFR Librar
0090: 79 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  y is free softwa
00a0: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
00b0: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
00c0: 6f 72 20 6d 6f 64 69 66 79 0a 69 74 20 75 6e 64  or modify.it und
00d0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
00e0: 74 68 65 20 47 4e 55 20 4c 65 73 73 65 72 20 47  the GNU Lesser G
00f0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
0100: 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68  cense as publish
0110: 65 64 20 62 79 0a 74 68 65 20 46 72 65 65 20 53  ed by.the Free S
0120: 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69  oftware Foundati
0130: 6f 6e 3b 20 65 69 74 68 65 72 20 76 65 72 73 69  on; either versi
0140: 6f 6e 20 32 2e 31 20 6f 66 20 74 68 65 20 4c 69  on 2.1 of the Li
0150: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0160: 75 72 0a 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur.option) any l
0170: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 0a 54  ater version...T
0180: 68 65 20 4d 50 46 52 20 4c 69 62 72 61 72 79 20  he MPFR Library 
0190: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
01a0: 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74 20  n the hope that 
01b0: 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75  it will be usefu
01c0: 6c 2c 20 62 75 74 0a 57 49 54 48 4f 55 54 20 41  l, but.WITHOUT A
01d0: 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74  NY WARRANTY; wit
01e0: 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d  hout even the im
01f0: 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f  plied warranty o
0200: 66 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  f MERCHANTABILIT
0210: 59 0a 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y.or FITNESS FOR
0220: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
0230: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
0240: 47 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 72  GNU Lesser Gener
0250: 61 6c 20 50 75 62 6c 69 63 0a 4c 69 63 65 6e 73  al Public.Licens
0260: 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69  e for more detai
0270: 6c 73 2e 0a 0a 59 6f 75 20 73 68 6f 75 6c 64 20  ls...You should 
0280: 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61 20  have received a 
0290: 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20  copy of the GNU 
02a0: 4c 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50  Lesser General P
02b0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 0a 61 6c  ublic License.al
02c0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 4d 50 46  ong with the MPF
02d0: 52 20 4c 69 62 72 61 72 79 3b 20 73 65 65 20 74  R Library; see t
02e0: 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 2e  he file COPYING.
02f0: 4c 49 42 2e 20 20 49 66 20 6e 6f 74 2c 20 77 72  LIB.  If not, wr
0300: 69 74 65 20 74 6f 0a 74 68 65 20 46 72 65 65 20  ite to.the Free 
0310: 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74  Software Foundat
0320: 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54 65  ion, Inc., 59 Te
0330: 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 75 69  mple Place - Sui
0340: 74 65 20 33 33 30 2c 20 42 6f 73 74 6f 6e 2c 0a  te 330, Boston,.
0350: 4d 41 20 30 32 31 31 31 2d 31 33 30 37 2c 20 55  MA 02111-1307, U
0360: 53 41 2e 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  SA. */..#include
0370: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0380: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0390: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
03a0: 0a 23 69 6e 63 6c 75 64 65 20 22 67 6d 70 2e 68  .#include "gmp.h
03b0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 70 66 72  ".#include "mpfr
03c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d 70  .h".#include "mp
03d0: 66 72 2d 74 65 73 74 2e 68 22 0a 0a 76 6f 69 64  fr-test.h"..void
03e0: 20 63 68 65 63 6b 20 5f 50 52 4f 54 4f 28 28 6c   check _PROTO((l
03f0: 6f 6e 67 20 69 6e 74 2c 20 6c 6f 6e 67 20 69 6e  ong int, long in
0400: 74 2c 20 6d 70 5f 72 6e 64 5f 74 2c 20 64 6f 75  t, mp_rnd_t, dou
0410: 62 6c 65 29 29 3b 20 0a 0a 76 6f 69 64 0a 63 68  ble)); ..void.ch
0420: 65 63 6b 20 28 6c 6f 6e 67 20 69 6e 74 20 6e 2c  eck (long int n,
0430: 20 6c 6f 6e 67 20 69 6e 74 20 64 2c 20 6d 70 5f   long int d, mp_
0440: 72 6e 64 5f 74 20 72 6e 64 2c 20 64 6f 75 62 6c  rnd_t rnd, doubl
0450: 65 20 79 29 0a 7b 0a 20 20 6d 70 71 5f 74 20 71  e y).{.  mpq_t q
0460: 3b 0a 20 20 6d 70 66 72 5f 74 20 78 2c 20 74 3b  ;.  mpfr_t x, t;
0470: 0a 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 69  .  double z;.  i
0480: 6e 74 20 69 6e 65 78 61 63 74 2c 20 63 6f 6d 70  nt inexact, comp
0490: 61 72 65 3b 0a 0a 20 20 6d 70 66 72 5f 69 6e 69  are;..  mpfr_ini
04a0: 74 32 20 28 78 2c 20 35 33 29 3b 0a 20 20 6d 70  t2 (x, 53);.  mp
04b0: 66 72 5f 69 6e 69 74 32 20 28 74 2c 20 6d 70 66  fr_init2 (t, mpf
04c0: 72 5f 67 65 74 5f 70 72 65 63 20 28 78 29 20 2b  r_get_prec (x) +
04d0: 20 6d 70 5f 62 69 74 73 5f 70 65 72 5f 6c 69 6d   mp_bits_per_lim
04e0: 62 29 3b 0a 20 20 6d 70 71 5f 69 6e 69 74 20 28  b);.  mpq_init (
04f0: 71 29 3b 0a 20 20 6d 70 71 5f 73 65 74 5f 73 69  q);.  mpq_set_si
0500: 20 28 71 2c 20 6e 2c 20 64 29 3b 0a 23 69 66 64   (q, n, d);.#ifd
0510: 65 66 20 4d 50 46 52 5f 48 41 56 45 5f 46 45 53  ef MPFR_HAVE_FES
0520: 45 54 52 4f 55 4e 44 0a 20 20 6d 70 66 72 5f 73  ETROUND.  mpfr_s
0530: 65 74 5f 6d 61 63 68 69 6e 65 5f 72 6e 64 5f 6d  et_machine_rnd_m
0540: 6f 64 65 20 28 72 6e 64 29 3b 0a 20 20 79 20 3d  ode (rnd);.  y =
0550: 20 28 64 6f 75 62 6c 65 29 20 6e 20 2f 20 64 3b   (double) n / d;
0560: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 65 78 61 63  .#endif.  inexac
0570: 74 20 3d 20 6d 70 66 72 5f 73 65 74 5f 71 20 28  t = mpfr_set_q (
0580: 78 2c 20 71 2c 20 72 6e 64 29 3b 0a 20 20 7a 20  x, q, rnd);.  z 
0590: 3d 20 6d 70 66 72 5f 67 65 74 5f 64 31 20 28 78  = mpfr_get_d1 (x
05a0: 29 3b 0a 0a 20 20 2f 2a 20 63 68 65 63 6b 20 76  );..  /* check v
05b0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 66 20 28 79  alues */.  if (y
05c0: 20 21 3d 20 7a 29 0a 20 20 20 20 7b 0a 20 20 20   != z).    {.   
05d0: 20 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72   fprintf (stderr
05e0: 2c 20 22 45 72 72 6f 72 20 66 6f 72 20 71 3d 25  , "Error for q=%
05f0: 6c 64 2f 25 6c 75 20 61 6e 64 20 72 6e 64 3d 25  ld/%lu and rnd=%
0600: 73 5c 6e 22 2c 20 6e 2c 20 64 2c 20 0a 09 20 20  s\n", n, d, ..  
0610: 20 20 20 6d 70 66 72 5f 70 72 69 6e 74 5f 72 6e     mpfr_print_rn
0620: 64 5f 6d 6f 64 65 20 28 72 6e 64 29 29 3b 0a 20  d_mode (rnd));. 
0630: 20 20 20 66 70 72 69 6e 74 66 20 28 73 74 64 65     fprintf (stde
0640: 72 72 2c 20 22 6c 69 62 6d 2e 61 20 67 69 76 65  rr, "libm.a give
0650: 73 20 25 31 2e 32 30 65 2c 20 6d 70 66 72 5f 73  s %1.20e, mpfr_s
0660: 65 74 5f 71 20 67 69 76 65 73 20 25 31 2e 32 30  et_q gives %1.20
0670: 65 5c 6e 22 2c 20 79 2c 20 7a 29 3b 0a 20 20 20  e\n", y, z);.   
0680: 20 65 78 69 74 20 28 31 29 3b 0a 20 20 20 20 7d   exit (1);.    }
0690: 0a 0a 20 20 2f 2a 20 63 68 65 63 6b 20 69 6e 65  ..  /* check ine
06a0: 78 61 63 74 20 66 6c 61 67 20 2a 2f 0a 20 20 69  xact flag */.  i
06b0: 66 20 28 6d 70 66 72 5f 6d 75 6c 5f 75 69 20 28  f (mpfr_mul_ui (
06c0: 74 2c 20 78 2c 20 28 64 20 3c 20 30 29 20 3f 20  t, x, (d < 0) ? 
06d0: 28 2d 64 29 20 3a 20 64 2c 20 72 6e 64 29 29 0a  (-d) : d, rnd)).
06e0: 20 20 20 20 7b 0a 20 20 20 20 20 20 66 70 72 69      {.      fpri
06f0: 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 74 20  ntf (stderr, "t 
0700: 3c 2d 20 78 20 2a 20 64 20 73 68 6f 75 6c 64 20  <- x * d should 
0710: 62 65 20 65 78 61 63 74 5c 6e 22 29 3b 0a 20 20  be exact\n");.  
0720: 20 20 20 20 65 78 69 74 20 28 31 29 3b 0a 20 20      exit (1);.  
0730: 20 20 7d 0a 20 20 63 6f 6d 70 61 72 65 20 3d 20    }.  compare = 
0740: 6d 70 66 72 5f 63 6d 70 5f 73 69 20 28 74 2c 20  mpfr_cmp_si (t, 
0750: 6e 29 3b 0a 20 20 69 66 20 28 28 28 69 6e 65 78  n);.  if (((inex
0760: 61 63 74 20 3d 3d 20 30 29 20 26 26 20 28 63 6f  act == 0) && (co
0770: 6d 70 61 72 65 20 21 3d 20 30 29 29 20 7c 7c 0a  mpare != 0)) ||.
0780: 20 20 20 20 20 20 28 28 69 6e 65 78 61 63 74 20        ((inexact 
0790: 3c 20 30 29 20 26 26 20 28 63 6f 6d 70 61 72 65  < 0) && (compare
07a0: 20 3e 3d 20 30 29 29 20 7c 7c 0a 20 20 20 20 20   >= 0)) ||.     
07b0: 20 28 28 69 6e 65 78 61 63 74 20 3e 20 30 29 20   ((inexact > 0) 
07c0: 26 26 20 28 63 6f 6d 70 61 72 65 20 3c 3d 20 30  && (compare <= 0
07d0: 29 29 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ))).    {.      
07e0: 66 70 72 69 6e 74 66 20 28 73 74 64 65 72 72 2c  fprintf (stderr,
07f0: 20 22 77 72 6f 6e 67 20 69 6e 65 78 61 63 74 20   "wrong inexact 
0800: 66 6c 61 67 3a 20 65 78 70 65 63 74 65 64 20 25  flag: expected %
0810: 64 2c 20 67 6f 74 20 25 64 5c 6e 22 2c 20 63 6f  d, got %d\n", co
0820: 6d 70 61 72 65 2c 0a 09 20 20 20 20 20 20 20 69  mpare,..       i
0830: 6e 65 78 61 63 74 29 3b 0a 20 20 20 20 20 20 65  nexact);.      e
0840: 78 69 74 20 28 31 29 3b 0a 20 20 20 20 7d 0a 0a  xit (1);.    }..
0850: 20 20 6d 70 66 72 5f 63 6c 65 61 72 20 28 78 29    mpfr_clear (x)
0860: 3b 0a 20 20 6d 70 66 72 5f 63 6c 65 61 72 20 28  ;.  mpfr_clear (
0870: 74 29 3b 0a 20 20 6d 70 71 5f 63 6c 65 61 72 20  t);.  mpq_clear 
0880: 28 71 29 3b 0a 7d 0a 0a 69 6e 74 0a 6d 61 69 6e  (q);.}..int.main
0890: 20 28 76 6f 69 64 29 0a 7b 0a 23 69 66 64 65 66   (void).{.#ifdef
08a0: 20 4d 50 46 52 5f 48 41 56 45 5f 46 45 53 45 54   MPFR_HAVE_FESET
08b0: 52 4f 55 4e 44 0a 20 20 6c 6f 6e 67 20 69 6e 74  ROUND.  long int
08c0: 20 69 2c 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65   i, n;.  unsigne
08d0: 64 20 6c 6f 6e 67 20 69 6e 74 20 64 3b 0a 20 20  d long int d;.  
08e0: 64 6f 75 62 6c 65 20 79 3b 0a 20 20 75 6e 73 69  double y;.  unsi
08f0: 67 6e 65 64 20 63 68 61 72 20 72 6e 64 3b 0a 0a  gned char rnd;..
0900: 20 20 6d 70 66 72 5f 74 65 73 74 5f 69 6e 69 74    mpfr_test_init
0910: 20 28 29 3b 0a 0a 20 20 53 45 45 44 5f 52 41 4e   ();..  SEED_RAN
0920: 44 28 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a 20  D(time(NULL));. 
0930: 20 66 6f 72 20 28 69 3d 30 3b 69 3c 31 30 30 30   for (i=0;i<1000
0940: 30 30 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 6e  000;i++) {.    n
0950: 20 3d 20 4c 4f 4e 47 5f 52 41 4e 44 28 29 3b 0a   = LONG_RAND();.
0960: 20 20 20 20 64 20 3d 20 4c 4f 4e 47 5f 52 41 4e      d = LONG_RAN
0970: 44 28 29 3b 0a 20 20 20 20 69 66 20 28 4c 4f 4e  D();.    if (LON
0980: 47 5f 52 41 4e 44 28 29 25 32 29 20 6e 20 3d 20  G_RAND()%2) n = 
0990: 2d 6e 3b 0a 20 20 20 20 72 6e 64 20 3d 20 4c 4f  -n;.    rnd = LO
09a0: 4e 47 5f 52 41 4e 44 28 29 20 25 20 34 3b 0a 20  NG_RAND() % 4;. 
09b0: 20 20 20 79 20 3d 20 28 64 6f 75 62 6c 65 29 20     y = (double) 
09c0: 6e 20 2f 20 64 3b 0a 20 20 20 20 63 68 65 63 6b  n / d;.    check
09d0: 28 6e 2c 20 64 2c 20 72 6e 64 2c 20 79 29 3b 0a  (n, d, rnd, y);.
09e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 63 68 65    }.#endif.  che
09f0: 63 6b 28 2d 31 36 34 37 32 32 39 38 32 32 2c 20  ck(-1647229822, 
0a00: 34 30 36 31 39 32 33 31 2c 20 47 4d 50 5f 52 4e  40619231, GMP_RN
0a10: 44 5a 2c 20 2d 34 2e 30 35 35 32 39 35 34 33 38  DZ, -4.055295438
0a20: 37 35 34 31 32 30 35 39 36 65 31 29 3b 0a 20 20  754120596e1);.  
0a30: 63 68 65 63 6b 28 2d 31 34 38 39 33 39 36 39 36  check(-148939696
0a40: 2c 20 31 36 37 33 32 38 35 34 39 30 2c 20 47 4d  , 1673285490, GM
0a50: 50 5f 52 4e 44 5a 2c 20 2d 38 2e 39 30 31 30 33  P_RNDZ, -8.90103
0a60: 33 31 34 30 34 39 35 33 34 38 35 35 30 31 65 2d  31404953485501e-
0a70: 32 29 3b 0a 20 20 63 68 65 63 6b 28 2d 34 34 31  2);.  check(-441
0a80: 33 32 32 35 39 30 2c 20 32 37 33 36 36 32 35 34  322590, 27366254
0a90: 35 2c 20 47 4d 50 5f 52 4e 44 5a 2c 20 2d 31 2e  5, GMP_RNDZ, -1.
0aa0: 36 31 32 36 35 32 35 30 39 36 38 31 32 32 30 35  6126525096812205
0ab0: 33 36 32 29 3b 0a 20 20 63 68 65 63 6b 28 2d 31  362);.  check(-1
0ac0: 36 33 31 31 35 36 38 39 35 2c 20 31 36 37 37 36  631156895, 16776
0ad0: 38 37 31 39 37 2c 20 47 4d 50 5f 52 4e 44 55 2c  87197, GMP_RNDU,
0ae0: 20 2d 39 2e 37 32 32 36 35 32 31 30 30 35 36 33   -9.722652100563
0af0: 31 37 37 31 39 31 65 2d 31 29 3b 0a 20 20 63 68  177191e-1);.  ch
0b00: 65 63 6b 28 32 31 34 31 33 33 32 35 37 31 2c 20  eck(2141332571, 
0b10: 33 31 31 37 36 30 31 2c 20 47 4d 50 5f 52 4e 44  3117601, GMP_RND
0b20: 5a 2c 20 36 2e 38 36 38 35 32 36 37 30 30 34 39  Z, 6.86852670049
0b30: 38 32 33 34 37 33 31 36 65 32 29 3b 0a 20 20 63  82347316e2);.  c
0b40: 68 65 63 6b 28 37 35 35 30 34 38 30 33 2c 20 34  heck(75504803, 4
0b50: 30 30 32 30 37 32 38 32 2c 20 47 4d 50 5f 52 4e  00207282, GMP_RN
0b60: 44 55 2c 20 31 2e 38 38 36 36 34 32 34 30 37 34  DU, 1.8866424074
0b70: 37 31 32 33 36 35 31 35 35 65 2d 31 29 3b 0a 20  712365155e-1);. 
0b80: 20 63 68 65 63 6b 28 36 34 33 35 36 32 33 30 38   check(643562308
0b90: 2c 20 32 33 31 30 30 38 39 34 2c 20 47 4d 50 5f  , 23100894, GMP_
0ba0: 52 4e 44 44 2c 20 32 2e 37 38 35 38 37 36 32 30  RNDD, 2.78587620
0bb0: 30 32 38 39 30 34 34 37 34 36 32 65 31 29 3b 0a  02890447462e1);.
0bc0: 20 20 63 68 65 63 6b 28 36 33 32 35 34 39 30 38    check(63254908
0bd0: 35 2c 20 31 38 33 31 39 33 35 38 30 32 2c 20 47  5, 1831935802, G
0be0: 4d 50 5f 52 4e 44 4e 2c 20 33 2e 34 35 32 38 39  MP_RNDN, 3.45289
0bf0: 39 38 34 36 37 36 30 30 32 33 30 33 39 33 65 2d  98467600230393e-
0c00: 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b  1);..  return 0;
0c10: 0a 7d 0a                                         .}.