~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gmp/mpfr/tests/tout_str.c

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2007-04-09 11:51:51 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070409115151-ql8cr0kalzx1jmla
Tags: 0.9i-20070324-2
Upload to unstable. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Test file for mpfr_out_str.
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 <float.h>
24
 
#include <stdio.h>
25
 
#include <stdlib.h>
26
 
#include <string.h>
27
 
#include <time.h>
28
 
#include "gmp.h"
29
 
#include "mpfr.h"
30
 
#include "mpfr-test.h"
31
 
 
32
 
FILE *fout;
33
 
 
34
 
#define check(d,r,b) check4(d,r,b,53)
35
 
 
36
 
void check4 _PROTO((double, mp_rnd_t, int, int)); 
37
 
void check_large _PROTO((void)); 
38
 
 
39
 
void
40
 
check4(double d, mp_rnd_t rnd, int base, int prec)
41
 
{
42
 
  mpfr_t x;
43
 
 
44
 
  mpfr_init2(x, prec);
45
 
  mpfr_set_d(x, d, rnd);
46
 
  fprintf(fout, "%1.19e base %d rnd %d:\n ", d, base, rnd);
47
 
  mpfr_out_str(fout, base, (base==2) ? prec : 0, x, rnd);
48
 
  fputc('\n', fout);
49
 
  mpfr_clear(x);
50
 
}
51
 
 
52
 
void
53
 
check_large (void)
54
 
{
55
 
  mpfr_t x; mp_exp_t e; char *s;
56
 
 
57
 
  mpfr_init(x);
58
 
 
59
 
  mpfr_set_prec (x, 7);
60
 
  mpfr_set_str_raw (x, "0.1010101E10");
61
 
  s = mpfr_get_str (NULL, &e, 10, 2, x, GMP_RNDU);
62
 
  free (s);
63
 
 
64
 
  /* checks rounding of negative numbers */
65
 
  mpfr_set_prec (x, 7);
66
 
  mpfr_set_d (x, -11.5, GMP_RNDN);
67
 
  s = mpfr_get_str (NULL, &e, 10, 2, x, GMP_RNDD);
68
 
  if (strcmp (s, "-12"))
69
 
    {
70
 
      fprintf (stderr, "Error in mpfr_get_str for x=-11.5 and rnd=GMP_RNDD\n");
71
 
      free (s);
72
 
      mpfr_clear (x);
73
 
      exit (1);
74
 
  }
75
 
  free (s);
76
 
 
77
 
  s = mpfr_get_str (NULL, &e, 10, 2, x, GMP_RNDU);
78
 
  if (strcmp (s, "-11"))
79
 
    {
80
 
      fprintf (stderr, "Error in mpfr_get_str for x=-11.5 and rnd=GMP_RNDU\n");
81
 
      free (s);
82
 
      mpfr_clear (x);
83
 
      exit (1);
84
 
    }
85
 
  free (s);
86
 
 
87
 
  /* bug found by Jean-Pierre Merlet, produced error in mpfr_get_str */
88
 
  mpfr_set_prec (x, 128);
89
 
  mpfr_set_str_raw (x, "0.10111001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011010E3");
90
 
  s = mpfr_get_str (NULL, &e, 10, 0, x, GMP_RNDU);
91
 
  free (s);
92
 
 
93
 
  mpfr_set_prec (x, 381);
94
 
  mpfr_set_str_raw (x, "0.111111111111111111111111111111111111111111111111111111111111111111101110110000100110011101101101001010111000101111000100100011110101010110101110100000010100001000110100000100011111001000010010000010001010111001011110000001110010111101100001111000101101100000010110000101100100000101010110010110001010100111001111100011100101100000100100111001100010010011110011011010110000001000010");
95
 
  s = mpfr_get_str (NULL, &e, 10, 0, x, GMP_RNDD);
96
 
  if (e != 0)
97
 
    {
98
 
      fprintf (stderr, "Error in mpfr_get_str for x=0.999999..., exponent is %d instead of 0\n", (int) e);
99
 
      exit (1);
100
 
    }
101
 
  free (s);
102
 
 
103
 
  mpfr_clear (x);
104
 
}
105
 
 
106
 
int
107
 
main (int argc, char *argv[])
108
 
{
109
 
  int i,N=10000,r,p; double d;
110
 
 
111
 
  check_large();
112
 
  /* with no argument: prints to /dev/null,
113
 
     tout_str N: prints N tests to stdout */
114
 
  if (argc==1) fout=fopen("/dev/null", "w");
115
 
  else { fout=stdout; N=atoi(argv[1]); }
116
 
  check(-1.37247529013405550000e+15, GMP_RNDN, 7);
117
 
  check(-1.5674376729569697500e+15, GMP_RNDN, 19);
118
 
  check(-5.71262771772792640000e-79, GMP_RNDU, 16);
119
 
  check(-0.0, GMP_RNDU, 7);
120
 
  check(-4.5306392613572974756e-308, GMP_RNDN, 8);
121
 
  check(-6.7265890111403371523e-165, GMP_RNDN, 4);
122
 
  check(-1.3242553591261807653e+156, GMP_RNDN, 16);
123
 
  check(-6.606499965302424244461355e233, GMP_RNDN, 10);
124
 
  check4(1.0, GMP_RNDN, 10, 120);
125
 
  check(1.0, GMP_RNDU, 10);
126
 
  check(4.059650008e-83, GMP_RNDN, 10);
127
 
  check(-7.4, GMP_RNDN, 10);
128
 
  check(0.997, GMP_RNDN, 10);
129
 
  check(-4.53063926135729747564e-308, GMP_RNDN, 10);
130
 
  check(2.14478198760196000000e+16, GMP_RNDN, 10);
131
 
  check(7.02293374921793516813e-84, GMP_RNDN, 10);
132
 
 
133
 
  /* random tests */
134
 
  SEED_RAND (time(NULL));
135
 
  for (i=0;i<N;i++)
136
 
    {
137
 
      do
138
 
        {
139
 
          d = drand ();
140
 
        }
141
 
#ifdef HAVE_DENORMS
142
 
      while (0);
143
 
#else
144
 
      while (ABS(d) < DBL_MIN);
145
 
#endif
146
 
      r = LONG_RAND() % 4;
147
 
      p = 2 + LONG_RAND() % 35;
148
 
      check (d, r, p);
149
 
    }
150
 
 
151
 
  return 0;
152
 
}