~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: 2006-05-17 02:46:26 UTC
  • Revision ID: james.westby@ubuntu.com-20060517024626-lljr08ftv9g9vefl
Tags: upstream-0.9h-20060510
ImportĀ upstreamĀ versionĀ 0.9h-20060510

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
}