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

数学计算

开发平台:

Unix_Linux

  1. /* Test mp*_class functions.
  2. Copyright 2002, 2003 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. /* Note that we don't use <climits> for LONG_MIN, but instead our own
  15.    definitions in gmp-impl.h.  In g++ 2.95.4 (debian 3.0) under
  16.    -mcpu=ultrasparc, limits.h sees __sparc_v9__ defined and assumes that
  17.    means long is 64-bit long, but it's only 32-bits, causing fatal compile
  18.    errors.  */
  19. #include "config.h"
  20. #include <string>
  21. #include "gmp.h"
  22. #include "gmpxx.h"
  23. #include "gmp-impl.h"
  24. #include "tests.h"
  25. using namespace std;
  26. void
  27. check_mpz (void)
  28. {
  29.   // mpz_class::fits_sint_p
  30.   {
  31.     int        fits;
  32.     mpz_class  z;
  33.     z = INT_MIN; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits);
  34.     z--;         fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits);
  35.     z = INT_MAX; fits = z.fits_sint_p(); ASSERT_ALWAYS (fits);
  36.     z++;         fits = z.fits_sint_p(); ASSERT_ALWAYS (! fits);
  37.   }
  38.   // mpz_class::fits_uint_p
  39.   {
  40.     int        fits;
  41.     mpz_class  z;
  42.     z = 0;        fits = z.fits_uint_p(); ASSERT_ALWAYS (fits);
  43.     z--;          fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits);
  44.     z = UINT_MAX; fits = z.fits_uint_p(); ASSERT_ALWAYS (fits);
  45.     z++;          fits = z.fits_uint_p(); ASSERT_ALWAYS (! fits);
  46.   }
  47.   // mpz_class::fits_slong_p
  48.   {
  49.     int        fits;
  50.     mpz_class  z;
  51.     z = LONG_MIN; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits);
  52.     z--;          fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits);
  53.     z = LONG_MAX; fits = z.fits_slong_p(); ASSERT_ALWAYS (fits);
  54.     z++;          fits = z.fits_slong_p(); ASSERT_ALWAYS (! fits);
  55.   }
  56.   // mpz_class::fits_ulong_p
  57.   {
  58.     int        fits;
  59.     mpz_class  z;
  60.     z = 0;         fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits);
  61.     z--;           fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits);
  62.     z = ULONG_MAX; fits = z.fits_ulong_p(); ASSERT_ALWAYS (fits);
  63.     z++;           fits = z.fits_ulong_p(); ASSERT_ALWAYS (! fits);
  64.   }
  65.   // mpz_class::fits_sshort_p
  66.   {
  67.     int        fits;
  68.     mpz_class  z;
  69.     z = SHRT_MIN; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits);
  70.     z--;          fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits);
  71.     z = SHRT_MAX; fits = z.fits_sshort_p(); ASSERT_ALWAYS (fits);
  72.     z++;          fits = z.fits_sshort_p(); ASSERT_ALWAYS (! fits);
  73.   }
  74.   // mpz_class::fits_ushort_p
  75.   {
  76.     int        fits;
  77.     mpz_class  z;
  78.     z = 0;         fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits);
  79.     z--;           fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits);
  80.     z = USHRT_MAX; fits = z.fits_ushort_p(); ASSERT_ALWAYS (fits);
  81.     z++;           fits = z.fits_ushort_p(); ASSERT_ALWAYS (! fits);
  82.   }
  83.   // mpz_class::get_mpz_t
  84.   {
  85.     mpz_class  z(0);
  86.     mpz_ptr    p = z.get_mpz_t();
  87.     ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0);
  88.   }
  89.   {
  90.     mpz_class  z(0);
  91.     mpz_srcptr p = z.get_mpz_t();
  92.     ASSERT_ALWAYS (mpz_cmp_ui (p, 0) == 0);
  93.   }
  94.   // mpz_class::get_d
  95.   // mpz_class::get_si
  96.   // mpz_class::get_ui
  97.   {
  98.     mpz_class  z(123);
  99.     { double d = z.get_d();  ASSERT_ALWAYS (d == 123.0); }
  100.     { long   l = z.get_si(); ASSERT_ALWAYS (l == 123L); }
  101.     { long   u = z.get_ui(); ASSERT_ALWAYS (u == 123L); }
  102.   }
  103.   {
  104.     mpz_class  z(-123);
  105.     { double d = z.get_d();  ASSERT_ALWAYS (d == -123.0); }
  106.     { long   l = z.get_si(); ASSERT_ALWAYS (l == -123L); }
  107.   }
  108.   // mpz_class::get_str
  109.   {
  110.     mpz_class  z(123);
  111.     string     s;
  112.     s = z.get_str(); ASSERT_ALWAYS (s == "123");
  113.     s = z.get_str(16); ASSERT_ALWAYS (s == "7b");
  114.     s = z.get_str(-16); ASSERT_ALWAYS (s == "7B");
  115.   }
  116.   // mpz_class::set_str
  117.   {
  118.     mpz_class  z;
  119.     int        ret;
  120.     ret = z.set_str ("123", 10);  ASSERT_ALWAYS (ret == 0 && z == 123);
  121.     ret = z.set_str ("7b",  16);  ASSERT_ALWAYS (ret == 0 && z == 123);
  122.     ret = z.set_str ("7B",  16);  ASSERT_ALWAYS (ret == 0 && z == 123);
  123.     ret = z.set_str ("0x7B", 0);  ASSERT_ALWAYS (ret == 0 && z == 123);
  124.     ret = z.set_str (string("123"), 10);  ASSERT_ALWAYS (ret == 0 && z == 123);
  125.     ret = z.set_str (string("7b"),  16);  ASSERT_ALWAYS (ret == 0 && z == 123);
  126.     ret = z.set_str (string("7B"),  16);  ASSERT_ALWAYS (ret == 0 && z == 123);
  127.     ret = z.set_str (string("0x7B"), 0);  ASSERT_ALWAYS (ret == 0 && z == 123);
  128.   }
  129. }
  130. void
  131. check_mpq (void)
  132. {
  133.   // mpq_class::canonicalize
  134.   {
  135.     mpq_class  q(12,9);
  136.     q.canonicalize();
  137.     ASSERT_ALWAYS (q.get_num() == 4);
  138.     ASSERT_ALWAYS (q.get_den() == 3);
  139.   }
  140.   // mpq_class::get_d
  141.   {
  142.     mpq_class  q(123);
  143.     { double d = q.get_d();  ASSERT_ALWAYS (d == 123.0); }
  144.   }
  145.   {
  146.     mpq_class  q(-123);
  147.     { double d = q.get_d();  ASSERT_ALWAYS (d == -123.0); }
  148.   }
  149.   // mpq_class::get_mpq_t
  150.   {
  151.     mpq_class  q(0);
  152.     mpq_ptr    p = q.get_mpq_t();
  153.     ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0);
  154.   }
  155.   {
  156.     mpq_class  q(0);
  157.     mpq_srcptr p = q.get_mpq_t();
  158.     ASSERT_ALWAYS (mpq_cmp_ui (p, 0, 1) == 0);
  159.   }
  160.   // mpq_class::get_num, mpq_class::get_den
  161.   {
  162.     mpq_class  q(4,5);
  163.     mpz_class  z;
  164.     z = q.get_num(); ASSERT_ALWAYS (z == 4);
  165.     z = q.get_den(); ASSERT_ALWAYS (z == 5);
  166.   }
  167.   // mpq_class::get_num_mpz_t, mpq_class::get_den_mpz_t
  168.   {
  169.     mpq_class  q(4,5);
  170.     mpz_ptr    p;
  171.     p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0);
  172.     p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0);
  173.   }
  174.   {
  175.     mpq_class  q(4,5);
  176.     mpz_srcptr p;
  177.     p = q.get_num_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 4) == 0);
  178.     p = q.get_den_mpz_t(); ASSERT_ALWAYS (mpz_cmp_ui (p, 5) == 0);
  179.   }
  180.   // mpq_class::get_str
  181.   {
  182.     mpq_class  q(17,11);
  183.     string     s;
  184.     s = q.get_str();    ASSERT_ALWAYS (s == "17/11");
  185.     s = q.get_str(10);  ASSERT_ALWAYS (s == "17/11");
  186.     s = q.get_str(16);  ASSERT_ALWAYS (s == "11/b");
  187.     s = q.get_str(-16); ASSERT_ALWAYS (s == "11/B");
  188.   }
  189.   // mpq_class::set_str
  190.   {
  191.     mpq_class  q;
  192.     int        ret;
  193.     ret = q.set_str ("123", 10);     ASSERT_ALWAYS (ret == 0 && q == 123);
  194.     ret = q.set_str ("4/5", 10);     ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5));
  195.     ret = q.set_str ("7b",  16);     ASSERT_ALWAYS (ret == 0 && q == 123);
  196.     ret = q.set_str ("7B",  16);     ASSERT_ALWAYS (ret == 0 && q == 123);
  197.     ret = q.set_str ("0x7B", 0);     ASSERT_ALWAYS (ret == 0 && q == 123);
  198.     ret = q.set_str ("0x10/17", 0);  ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17));
  199.     ret = q.set_str (string("4/5"), 10);  ASSERT_ALWAYS (ret == 0 && q == mpq_class(4,5));
  200.     ret = q.set_str (string("123"), 10);  ASSERT_ALWAYS (ret == 0 && q == 123);
  201.     ret = q.set_str (string("7b"),  16);  ASSERT_ALWAYS (ret == 0 && q == 123);
  202.     ret = q.set_str (string("7B"),  16);  ASSERT_ALWAYS (ret == 0 && q == 123);
  203.     ret = q.set_str (string("0x7B"), 0);  ASSERT_ALWAYS (ret == 0 && q == 123);
  204.     ret = q.set_str (string("0x10/17"), 0);  ASSERT_ALWAYS (ret == 0 && q == mpq_class(16,17));
  205.   }
  206. }
  207. void
  208. check_mpf (void)
  209. {
  210.   // mpf_class::fits_sint_p
  211.   {
  212.     int        fits;
  213.     mpf_class  f (0, 2*8*sizeof(int));
  214.     f = INT_MIN; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits);
  215.     f--;         fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits);
  216.     f = INT_MAX; fits = f.fits_sint_p(); ASSERT_ALWAYS (fits);
  217.     f++;         fits = f.fits_sint_p(); ASSERT_ALWAYS (! fits);
  218.   }
  219.   // mpf_class::fits_uint_p
  220.   {
  221.     int        fits;
  222.     mpf_class  f (0, 2*8*sizeof(int));
  223.     f = 0;        fits = f.fits_uint_p(); ASSERT_ALWAYS (fits);
  224.     f--;          fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits);
  225.     f = UINT_MAX; fits = f.fits_uint_p(); ASSERT_ALWAYS (fits);
  226.     f++;          fits = f.fits_uint_p(); ASSERT_ALWAYS (! fits);
  227.   }
  228.   // mpf_class::fits_slong_p
  229.   {
  230.     int        fits;
  231.     mpf_class  f (0, 2*8*sizeof(long));
  232.     f = LONG_MIN; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits);
  233.     f--;          fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits);
  234.     f = LONG_MAX; fits = f.fits_slong_p(); ASSERT_ALWAYS (fits);
  235.     f++;          fits = f.fits_slong_p(); ASSERT_ALWAYS (! fits);
  236.   }
  237.   // mpf_class::fits_ulong_p
  238.   {
  239.     int        fits;
  240.     mpf_class  f (0, 2*8*sizeof(long));
  241.     f = 0;         fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits);
  242.     f--;           fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits);
  243.     f = ULONG_MAX; fits = f.fits_ulong_p(); ASSERT_ALWAYS (fits);
  244.     f++;           fits = f.fits_ulong_p(); ASSERT_ALWAYS (! fits);
  245.   }
  246.   // mpf_class::fits_sshort_p
  247.   {
  248.     int        fits;
  249.     mpf_class  f (0, 2*8*sizeof(short));
  250.     f = SHRT_MIN; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits);
  251.     f--;          fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits);
  252.     f = SHRT_MAX; fits = f.fits_sshort_p(); ASSERT_ALWAYS (fits);
  253.     f++;          fits = f.fits_sshort_p(); ASSERT_ALWAYS (! fits);
  254.   }
  255.   // mpf_class::fits_ushort_p
  256.   {
  257.     int        fits;
  258.     mpf_class  f (0, 2*8*sizeof(short));
  259.     f = 0;         fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits);
  260.     f--;           fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits);
  261.     f = USHRT_MAX; fits = f.fits_ushort_p(); ASSERT_ALWAYS (fits);
  262.     f++;           fits = f.fits_ushort_p(); ASSERT_ALWAYS (! fits);
  263.   }
  264.   // mpf_class::get_d
  265.   // mpf_class::get_si
  266.   // mpf_class::get_ui
  267.   {
  268.     mpf_class  f(123);
  269.     { double d = f.get_d();  ASSERT_ALWAYS (d == 123.0); }
  270.     { long   l = f.get_si(); ASSERT_ALWAYS (l == 123L); }
  271.     { long   u = f.get_ui(); ASSERT_ALWAYS (u == 123L); }
  272.   }
  273.   {
  274.     mpf_class  f(-123);
  275.     { double d = f.get_d();  ASSERT_ALWAYS (d == -123.0); }
  276.     { long   l = f.get_si(); ASSERT_ALWAYS (l == -123L); }
  277.   }
  278.   // mpf_class::get_prec
  279.   {
  280.     mpf_class  f;
  281.     ASSERT_ALWAYS (f.get_prec() == mpf_get_default_prec());
  282.   }
  283.   // mpf_class::get_str
  284.   {
  285.     mpf_class  f(123);
  286.     string     s;
  287.     mp_exp_t   e;
  288.     s = f.get_str(e);        ASSERT_ALWAYS (s == "123" && e == 3);
  289.     s = f.get_str(e,  16);   ASSERT_ALWAYS (s == "7b"  && e == 2);
  290.     s = f.get_str(e, -16);   ASSERT_ALWAYS (s == "7B"  && e == 2);
  291.     s = f.get_str(e, 10, 2); ASSERT_ALWAYS (s == "12"  && e == 3);
  292.     s = f.get_str(e, 10, 1); ASSERT_ALWAYS (s == "1"   && e == 3);
  293.   }
  294.   // mpf_class::set_str
  295.   {
  296.     mpf_class  f;
  297.     int        ret;
  298.     ret = f.set_str ("123",     10);  ASSERT_ALWAYS (ret == 0 && f == 123);
  299.     ret = f.set_str ("123e1",   10);  ASSERT_ALWAYS (ret == 0 && f == 1230);
  300.     ret = f.set_str ("1230e-1", 10);  ASSERT_ALWAYS (ret == 0 && f == 123);
  301.     ret = f.set_str ("7b",      16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  302.     ret = f.set_str ("7B",      16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  303.     ret = f.set_str ("7B@1",    16);  ASSERT_ALWAYS (ret == 0 && f == 1968);
  304.     ret = f.set_str ("7B0@-1",  16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  305.     ret = f.set_str (string("123"),     10);  ASSERT_ALWAYS (ret == 0 && f == 123);
  306.     ret = f.set_str (string("123e1"),   10);  ASSERT_ALWAYS (ret == 0 && f == 1230);
  307.     ret = f.set_str (string("1230e-1"), 10);  ASSERT_ALWAYS (ret == 0 && f == 123);
  308.     ret = f.set_str (string("7b"),      16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  309.     ret = f.set_str (string("7B"),      16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  310.     ret = f.set_str (string("7B@1"),    16);  ASSERT_ALWAYS (ret == 0 && f == 1968);
  311.     ret = f.set_str (string("7B0@-1"),  16);  ASSERT_ALWAYS (ret == 0 && f == 123);
  312.   }
  313.   // mpf_class::set_prec
  314.   {
  315.     mpf_class  f;
  316.     f.set_prec (256);
  317.     ASSERT_ALWAYS (f.get_prec () >= 256);
  318.   }
  319.   // mpf_class::set_prec_raw
  320.   {
  321.     mpf_class  f (0, 100 * GMP_NUMB_BITS);
  322.     f.set_prec_raw (5 * GMP_NUMB_BITS);
  323.     ASSERT_ALWAYS (f.get_prec () >= 5 * GMP_NUMB_BITS);
  324.     ASSERT_ALWAYS (f.get_prec () < 100 * GMP_NUMB_BITS);
  325.     f.set_prec_raw (100 * GMP_NUMB_BITS);
  326.   }
  327. }
  328. int
  329. main (void)
  330. {
  331.   tests_start();
  332.   check_mpz();
  333.   check_mpq();
  334.   check_mpf();
  335.   tests_end();
  336.   return 0;
  337. }