Esempio n. 1
0
static void
test_sum (mpfr_prec_t f, unsigned long n)
{
  mpfr_t sum, real_sum, real_non_rounded;
  mpfr_t *tab;
  unsigned long i;
  int rnd_mode;

  /* Init */
  tab = (mpfr_t *) (*__gmp_allocate_func) (n * sizeof(mpfr_t));
  for (i = 0; i < n; i++)
    mpfr_init2 (tab[i], f);
  mpfr_inits2 (f, sum, real_sum, real_non_rounded, (mpfr_ptr) 0);

  /* First Uniform */
  for (i = 0; i < n; i++)
    mpfr_urandomb (tab[i], RANDS);
  algo_exact (real_non_rounded, tab, n, f);
  for (rnd_mode = 0; rnd_mode < MPFR_RND_MAX; rnd_mode++)
    {
      sum_tab (sum, tab, n, (mpfr_rnd_t) rnd_mode);
      mpfr_set (real_sum, real_non_rounded, (mpfr_rnd_t) rnd_mode);
      if (mpfr_cmp (real_sum, sum) != 0)
        {
          printf ("mpfr_sum incorrect.\n");
          mpfr_dump (real_sum);
          mpfr_dump (sum);
          exit (1);
        }
    }

  /* Then non uniform */
  for (i = 0; i < n; i++)
    {
      mpfr_urandomb (tab[i], RANDS);
      if (! mpfr_zero_p (tab[i]))
        mpfr_set_exp (tab[i], randlimb () % 1000);
    }
  algo_exact (real_non_rounded, tab, n, f);
  for (rnd_mode = 0; rnd_mode < MPFR_RND_MAX; rnd_mode++)
    {
      sum_tab (sum, tab, n, (mpfr_rnd_t) rnd_mode);
      mpfr_set (real_sum, real_non_rounded, (mpfr_rnd_t) rnd_mode);
      if (mpfr_cmp (real_sum, sum) != 0)
        {
          printf ("mpfr_sum incorrect.\n");
          mpfr_dump (real_sum);
          mpfr_dump (sum);
          exit (1);
        }
    }

  /* Clear stuff */
  for (i = 0; i < n; i++)
    mpfr_clear (tab[i]);
  mpfr_clears (sum, real_sum, real_non_rounded, (mpfr_ptr) 0);
  (*__gmp_free_func) (tab, n * sizeof(mpfr_t));
}
Esempio n. 2
0
int
main (void)
{
  mpfr_t *tab;
  mpfr_ptr *tabtmp;
  unsigned long i, n;
  mp_prec_t f;
  int rnd_mode;
  mpfr_srcptr *perm;
  mpfr_t sum, real_sum, real_non_rounded;

  tests_start_mpfr ();
  n = 1026;
  f = 1764;
  tab = (mpfr_t *) malloc (n * sizeof(mpfr_t));
  for (i = 0; i < n; i++)
  {
      mpfr_init2 (tab[i], f);
      mpfr_urandomb (tab[i], RANDS);
  }
  mpfr_init2 (sum, f);
  mpfr_init2 (real_sum, f);
  algo_exact (real_non_rounded, tab, n, f);
  for (rnd_mode = 0; rnd_mode < GMP_RND_MAX; rnd_mode++)
  {
      mpfr_list_sum (sum, tab, n, (mp_rnd_t) rnd_mode);
      mpfr_set (real_sum, real_non_rounded, (mp_rnd_t) rnd_mode);
      if (mpfr_cmp (real_sum, sum) != 0)
      {
          printf ("mpfr_list_sum incorrect.\n");
          mpfr_print_binary (real_sum);
          putchar ('\n');
          mpfr_print_binary (sum);
          putchar ('\n');
          return 1;
      }
  }

  for (i = 0; i < n; i++)
  {
      mpfr_urandomb (tab[i], RANDS);
  }

  mpfr_set_exp (tab[0], 1000);
  mpfr_clear (real_non_rounded);
  algo_exact (real_non_rounded, tab, n, f);
  
  for (rnd_mode = 0; rnd_mode < GMP_RND_MAX; rnd_mode++)
  {
      mpfr_list_sum (sum, tab, n, (mp_rnd_t) rnd_mode);
      mpfr_set (real_sum, real_non_rounded, (mp_rnd_t) rnd_mode);
      if (mpfr_cmp (real_sum, sum) != 0)
      {
          printf ("mpfr_list_sum incorrect.\n");
          mpfr_print_binary (real_sum);
          putchar ('\n');
          mpfr_print_binary (sum);
          putchar ('\n');
          return 1;
      }
  }


  /* list_sum tested, now test the sorting function */

  for (i = 0; i < n; i++)
      mpfr_urandomb (tab[i], RANDS);
  tabtmp = (mpfr_ptr *) malloc (n * sizeof(mpfr_ptr));
  perm = (mpfr_srcptr *) malloc (n * sizeof(mpfr_srcptr));

  for (i = 0; i < n; i++)
       tabtmp[i] = tab[i];

  mpfr_count_sort (tabtmp, n, perm);

  if (is_sorted (n, perm) == 0)
  {
      printf ("mpfr_count_sort incorrect.\n");
      for (i = 0; i < n; i++)
      {
          mpfr_print_binary (perm[i]);
          putchar ('\n');
      }
      return 1;
  }

  for (i = 0; i < n; i++)
      mpfr_clear (tab[i]);

  mpfr_clear (sum);
  mpfr_clear (real_sum);
  mpfr_clear (real_non_rounded);
  free (tab);
  free (perm);
  tests_end_mpfr ();
  return 0;
}