t-set_q.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_set_q.
  2. Copyright 2004 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. void
  20. check_one (mpf_ptr got, mpq_srcptr q)
  21. {
  22.   mpf_t  n, d;
  23.   mpf_set_q (got, q);
  24.   PTR(n) = PTR(&q->_mp_num);
  25.   SIZ(n) = SIZ(&q->_mp_num);
  26.   EXP(n) = ABSIZ(&q->_mp_num);
  27.   PTR(d) = PTR(&q->_mp_den);
  28.   SIZ(d) = SIZ(&q->_mp_den);
  29.   EXP(d) = ABSIZ(&q->_mp_den);
  30.   if (! refmpf_validate_division ("mpf_set_q", got, n, d))
  31.     {
  32.       mp_trace_base = -16;
  33.       mpq_trace ("   q", q);
  34.       abort ();
  35.     }
  36. }
  37. void
  38. check_rand (void)
  39. {
  40.   unsigned long  min_prec = __GMPF_BITS_TO_PREC (1);
  41.   gmp_randstate_ptr  rands = RANDS;
  42.   unsigned long  prec;
  43.   mpf_t  got;
  44.   mpq_t  q;
  45.   int    i;
  46.   mpf_init (got);
  47.   mpq_init (q);
  48.   for (i = 0; i < 400; i++)
  49.     {
  50.       /* result precision */
  51.       prec = min_prec + gmp_urandomm_ui (rands, 20L);
  52.       refmpf_set_prec_limbs (got, prec);
  53.       /* num */
  54.       prec = gmp_urandomm_ui (rands, 20L * GMP_NUMB_BITS);
  55.       mpz_rrandomb (mpq_numref(q), rands, prec);
  56.       /* possibly negative num */
  57.       if (gmp_urandomb_ui (rands, 1L))
  58.         mpz_neg (mpq_numref(q), mpq_numref(q));
  59.       /* den, non-zero */
  60.       do {
  61.         prec = gmp_urandomm_ui (rands, 20L * GMP_NUMB_BITS);
  62.         mpz_rrandomb (mpq_denref(q), rands, prec);
  63.       } while (mpz_sgn (mpq_denref(q)) <= 0);
  64.       check_one (got, q);
  65.     }
  66.   mpf_clear (got);
  67.   mpq_clear (q);
  68. }
  69. void
  70. check_various (void)
  71. {
  72.   mpf_t got;
  73.   mpq_t q;
  74.   mpf_init (got);
  75.   mpq_init (q);
  76.   /* 1/1 == 1 */
  77.   mpf_set_prec (got, 20L);
  78.   mpq_set_ui (q, 1L, 1L);
  79.   mpf_set_q (got, q);
  80.   MPF_CHECK_FORMAT (got);
  81.   ASSERT_ALWAYS (mpf_cmp_ui (got, 1L) == 0);
  82.   /* 1/(2^n+1), a case where truncating the divisor would be wrong */
  83.   mpf_set_prec (got, 500L);
  84.   mpq_set_ui (q, 1L, 1L);
  85.   mpz_mul_2exp (mpq_denref(q), mpq_denref(q), 800L);
  86.   mpz_add_ui (mpq_denref(q), mpq_denref(q), 1L);
  87.   check_one (got, q);
  88.   mpf_clear (got);
  89.   mpq_clear (q);
  90. }
  91. int
  92. main (void)
  93. {
  94.   tests_start ();
  95.   check_various ();
  96.   check_rand ();
  97.   tests_end ();
  98.   exit (0);
  99. }