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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_sizeinbase.
  2. Copyright 2001, 2002 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. #if 0
  20.   /* Disabled due to the bogosity of trying to fake an _mp_d pointer to
  21.      below an object.  Has been seen to fail on a hppa system and on ia64.  */
  22. /* Create a fake mpz consisting of just a single 1 bit, with totbits being
  23.    the total number of bits, inclusive of that 1 bit.  */
  24. void
  25. mpz_fake_bits (mpz_ptr z, unsigned long totbits)
  26. {
  27.   static mp_limb_t  n;
  28.   unsigned long     zero_bits, zero_limbs;
  29.   zero_bits = totbits - 1;
  30.   zero_limbs = zero_bits / GMP_NUMB_BITS;
  31.   zero_bits %= GMP_NUMB_BITS;
  32.   SIZ(z) = zero_limbs + 1;
  33.   PTR(z) = (&n) - (SIZ(z) - 1);
  34.   n = CNST_LIMB(1) << zero_bits;
  35.   ASSERT_ALWAYS (mpz_sizeinbase (z, 2) == totbits);
  36. }
  37. /* This was seen to fail on a GNU/Linux powerpc32 with gcc 2.95.2,
  38.    apparently due to a doubtful value of mp_bases[10].chars_per_bit_exactly
  39.    (0X1.34413509F79FDP-2 whereas 0X1.34413509F79FFP-2 is believed correct).
  40.    Presumably this is a glibc problem when gcc converts the decimal string
  41.    in mp_bases.c, or maybe it's only a function of the rounding mode during
  42.    compilation.  */
  43. void
  44. check_sample (void)
  45. {
  46.   unsigned long  totbits = 198096465;
  47.   int        base = 10;
  48.   size_t     want = 59632979;
  49.   size_t     got;
  50.   mpz_t      z;
  51.   mpz_fake_bits (z, totbits);
  52.   got = mpz_sizeinbase (z, base);
  53.   if (got != want)
  54.     {
  55.       printf ("mpz_sizeinbasen");
  56.       printf ("  base    %dn",  base);
  57.       printf ("  totbits %lun", totbits);
  58.       printf ("  got     %un",  got);
  59.       printf ("  want    %un",  want);
  60.       abort ();
  61.     }
  62. }
  63. #endif
  64. int
  65. main (void)
  66. {
  67.   tests_start ();
  68.   /* check_sample (); */
  69.   tests_end ();
  70.   exit (0);
  71. }