Blame tests/tpow_ui.c

Packit Service 2e9770
/* tpow_ui -- test file for mpc_pow_ui.
Packit Service 2e9770
Packit Service 2e9770
Copyright (C) 2009, 2010, 2012, 2013 INRIA
Packit Service 2e9770
Packit Service 2e9770
This file is part of GNU MPC.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is free software; you can redistribute it and/or modify it under
Packit Service 2e9770
the terms of the GNU Lesser General Public License as published by the
Packit Service 2e9770
Free Software Foundation; either version 3 of the License, or (at your
Packit Service 2e9770
option) any later version.
Packit Service 2e9770
Packit Service 2e9770
GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service 2e9770
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service 2e9770
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
Packit Service 2e9770
more details.
Packit Service 2e9770
Packit Service 2e9770
You should have received a copy of the GNU Lesser General Public License
Packit Service 2e9770
along with this program. If not, see http://www.gnu.org/licenses/ .
Packit Service 2e9770
*/
Packit Service 2e9770
Packit Service 2e9770
#include <limits.h> /* for CHAR_BIT */
Packit Service 2e9770
#include "mpc-tests.h"
Packit Service 2e9770
Packit Service 2e9770
static void
Packit Service 2e9770
compare_mpc_pow (mpfr_prec_t pmax, int iter, unsigned long nbits)
Packit Service 2e9770
{
Packit Service 2e9770
  mpfr_prec_t p;
Packit Service 2e9770
  mpc_t x, y, z, t;
Packit Service 2e9770
  unsigned long n;
Packit Service 2e9770
  int i, inex_pow, inex_pow_ui;
Packit Service 2e9770
  mpc_rnd_t rnd;
Packit Service 2e9770
Packit Service 2e9770
  mpc_init3 (y, sizeof (unsigned long) * CHAR_BIT, MPFR_PREC_MIN);
Packit Service 2e9770
  for (p = MPFR_PREC_MIN; p <= pmax; p++)
Packit Service 2e9770
    for (i = 0; i < iter; i++)
Packit Service 2e9770
      {
Packit Service 2e9770
        mpc_init2 (x, p);
Packit Service 2e9770
        mpc_init2 (z, p);
Packit Service 2e9770
        mpc_init2 (t, p);
Packit Service 2e9770
        mpc_urandom (x, rands);
Packit Service 2e9770
        n = gmp_urandomb_ui (rands, nbits); /* 0 <= n < 2^nbits */
Packit Service 2e9770
        mpc_set_ui (y, n, MPC_RNDNN);
Packit Service 2e9770
        for (rnd = 0; rnd < 16; rnd ++)
Packit Service 2e9770
          {
Packit Service 2e9770
            inex_pow = mpc_pow (z, x, y, rnd);
Packit Service 2e9770
            inex_pow_ui = mpc_pow_ui (t, x, n, rnd);
Packit Service 2e9770
            if (mpc_cmp (z, t) != 0)
Packit Service 2e9770
              {
Packit Service 2e9770
                printf ("mpc_pow and mpc_pow_ui differ for x=");
Packit Service 2e9770
                mpc_out_str (stdout, 10, 0, x, MPC_RNDNN);
Packit Service 2e9770
                printf (" n=%lu\n", n);
Packit Service 2e9770
                printf ("mpc_pow gives ");
Packit Service 2e9770
                mpc_out_str (stdout, 10, 0, z, MPC_RNDNN);
Packit Service 2e9770
                printf ("\nmpc_pow_ui gives ");
Packit Service 2e9770
                mpc_out_str (stdout, 10, 0, t, MPC_RNDNN);
Packit Service 2e9770
                printf ("\n");
Packit Service 2e9770
                exit (1);
Packit Service 2e9770
              }
Packit Service 2e9770
            if (inex_pow != inex_pow_ui)
Packit Service 2e9770
              {
Packit Service 2e9770
                printf ("mpc_pow and mpc_pow_ui give different flags for x=");
Packit Service 2e9770
                mpc_out_str (stdout, 10, 0, x, MPC_RNDNN);
Packit Service 2e9770
                printf (" n=%lu\n", n);
Packit Service 2e9770
                printf ("mpc_pow gives %d\n", inex_pow);
Packit Service 2e9770
                printf ("mpc_pow_ui gives %d\n", inex_pow_ui);
Packit Service 2e9770
                exit (1);
Packit Service 2e9770
              }
Packit Service 2e9770
          }
Packit Service 2e9770
        mpc_clear (x);
Packit Service 2e9770
        mpc_clear (z);
Packit Service 2e9770
        mpc_clear (t);
Packit Service 2e9770
      }
Packit Service 2e9770
  mpc_clear (y);
Packit Service 2e9770
}
Packit Service 2e9770
Packit Service 2e9770
#define MPC_FUNCTION_CALL                                               \
Packit Service 2e9770
  P[0].mpc_inex = mpc_pow_ui (P[1].mpc, P[2].mpc, P[3].ui, P[4].mpc_rnd)
Packit Service 2e9770
#define MPC_FUNCTION_CALL_REUSE_OP1                                     \
Packit Service 2e9770
  P[0].mpc_inex = mpc_pow_ui (P[1].mpc, P[1].mpc, P[3].ui, P[4].mpc_rnd)
Packit Service 2e9770
Packit Service 2e9770
#include "data_check.tpl"
Packit Service 2e9770
Packit Service 2e9770
int
Packit Service 2e9770
main (int argc, char *argv[])
Packit Service 2e9770
{
Packit Service 2e9770
  mpc_t z;
Packit Service 2e9770
Packit Service 2e9770
  if (argc != 1)
Packit Service 2e9770
    {
Packit Service 2e9770
      mpfr_prec_t p;
Packit Service 2e9770
      long int n, k;
Packit Service 2e9770
      mpc_t res;
Packit Service 2e9770
      if (argc != 3 && argc != 4)
Packit Service 2e9770
        {
Packit Service 2e9770
          printf ("Usage: tpow_ui precision exponent [k]\n");
Packit Service 2e9770
          exit (1);
Packit Service 2e9770
        }
Packit Service 2e9770
      p = atoi (argv[1]);
Packit Service 2e9770
      n = atoi (argv[2]);
Packit Service 2e9770
      MPC_ASSERT (n >= 0);
Packit Service 2e9770
      k = (argc > 3) ? atoi (argv[3]) : 1;
Packit Service 2e9770
      MPC_ASSERT (k >= 0);
Packit Service 2e9770
      mpc_init2 (z, p);
Packit Service 2e9770
      mpc_init2 (res, p);
Packit Service 2e9770
      mpfr_const_pi (mpc_realref (z), MPFR_RNDN);
Packit Service 2e9770
      mpfr_div_2exp (mpc_realref (z), mpc_realref (z), 2, MPFR_RNDN);
Packit Service 2e9770
      mpfr_const_log2 (mpc_imagref (z), MPFR_RNDN);
Packit Service 2e9770
      while (k--)
Packit Service 2e9770
        mpc_pow_ui (res, z, (unsigned long int) n, MPC_RNDNN);
Packit Service 2e9770
      mpc_clear (z);
Packit Service 2e9770
      mpc_clear (res);
Packit Service 2e9770
      return 0;
Packit Service 2e9770
    }
Packit Service 2e9770
Packit Service 2e9770
  test_start ();
Packit Service 2e9770
Packit Service 2e9770
  data_check_template ("pow_ui.dsc", "pow_ui.dat");
Packit Service 2e9770
Packit Service 2e9770
  compare_mpc_pow (100, 5, 19);
Packit Service 2e9770
Packit Service 2e9770
  test_end ();
Packit Service 2e9770
Packit Service 2e9770
  return 0;
Packit Service 2e9770
}