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

数学计算

开发平台:

Unix_Linux

  1. /* Test ostream formatted output.
  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 <iostream>
  15. #include <cstdlib>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. using namespace std;
  20. int   option_check_standard = 0;
  21. #define CALL(expr)
  22.   do {
  23.     got.flags (data[i].flags);
  24.     got.width (data[i].width);
  25.     got.precision (data[i].precision);
  26.     if (data[i].fill == '')
  27.       got.fill (' ');
  28.     else
  29.       got.fill (data[i].fill);
  30.     if (! (expr))
  31.       {
  32. cout << ""got" output errorn";
  33. abort ();
  34.       }
  35.     if (got.width() != 0)
  36.       {
  37. cout << ""got" width not reset to 0n";
  38. abort ();
  39.       }
  40.   } while (0)
  41. #define DUMP()
  42.   do {
  43.     cout << "  want:  |" << data[i].want << "|n";
  44.     cout << "  got:   |" << got.str() << "|n";
  45.     cout << "  width: " << data[i].width << "n";
  46.     cout << "  prec:  " << got.precision() << "n";
  47.     cout << "  flags: " << hex << (unsigned long) got.flags() << "n";
  48.   } while (0)
  49. #define ABORT() 
  50.   do {          
  51.     DUMP ();    
  52.     abort ();   
  53.   } while (0)
  54. void
  55. check_mpz (void)
  56. {
  57.   static const struct {
  58.     const char     *z;
  59.     const char     *want;
  60.     ios::fmtflags  flags;
  61.     int            width;
  62.     int            precision;
  63.     char           fill;
  64.   } data[] = {
  65.     { "0", "0", ios::dec },
  66.     { "0", "0", ios::oct },
  67.     { "0", "0", ios::oct | ios::showbase },
  68.     { "0", "0", ios::hex },
  69.     { "0", "0x0", ios::hex | ios::showbase },
  70.     { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
  71.     { "1", "****1", ios::dec, 5, 0, '*' },
  72.     { "-1", "   -1",  ios::dec | ios::right,    5 },
  73.     { "-1", "-   1",  ios::dec | ios::internal, 5 },
  74.     { "-1", "-1   ",  ios::dec | ios::left,     5 },
  75.     { "1", "   0x1", ios::hex | ios::showbase | ios::right,    6 },
  76.     { "1", "0x   1", ios::hex | ios::showbase | ios::internal, 6 },
  77.     { "1", "0x1   ", ios::hex | ios::showbase | ios::left,     6 },
  78.     { "1", "   +0x1", ios::hex | ios::showbase | ios::showpos | ios::right,
  79.       7 },
  80.     { "1", "+0x   1", ios::hex | ios::showbase | ios::showpos | ios::internal,
  81.       7 },
  82.     { "1", "+0x1   ", ios::hex | ios::showbase | ios::showpos | ios::left,
  83.       7 },
  84.     {  "123",    "7b", ios::hex },
  85.     {  "123",    "7B", ios::hex | ios::uppercase },
  86.     {  "123",  "0x7b", ios::hex | ios::showbase },
  87.     {  "123",  "0X7B", ios::hex | ios::showbase | ios::uppercase },
  88.     { "-123", "-0x7b", ios::hex | ios::showbase },
  89.     { "-123", "-0X7B", ios::hex | ios::showbase | ios::uppercase },
  90.     {  "123",   "173", ios::oct },
  91.     {  "123",   "173", ios::oct | ios::uppercase },
  92.     {  "123",  "0173", ios::oct | ios::showbase },
  93.     {  "123",  "0173", ios::oct | ios::showbase | ios::uppercase },
  94.     { "-123", "-0173", ios::oct | ios::showbase },
  95.     { "-123", "-0173", ios::oct | ios::showbase | ios::uppercase },
  96.   };
  97.   size_t  i;
  98.   mpz_t   z;
  99.   mpz_init (z);
  100.   for (i = 0; i < numberof (data); i++)
  101.     {
  102.       mpz_set_str_or_abort (z, data[i].z, 0);
  103.       if (option_check_standard
  104.   && mpz_fits_slong_p (z)
  105.   // no negatives or showpos in hex or oct
  106.   && (((data[i].flags & ios::basefield) == ios::hex
  107.        || (data[i].flags & ios::basefield) == ios::oct)
  108.       ? (mpz_sgn (z) >= 0
  109.  && ! (data[i].flags & ios::showpos))
  110.       : 1)
  111.   )
  112. {
  113.   ostringstream  got;
  114.   long  n = mpz_get_si (z);
  115.   CALL (got << n);
  116.   if (got.str().compare (data[i].want) != 0)
  117.     {
  118.       cout << "check_mpz data[" << i
  119.    << "] doesn't match standard ostream outputn";
  120.       cout << "  z:     " << data[i].z << "n";
  121.       cout << "  n:     " << n << "n";
  122.       DUMP ();
  123.     }
  124. }
  125.       {
  126. ostringstream  got;
  127. CALL (got << z);
  128. if (got.str().compare (data[i].want) != 0)
  129.   {
  130.     cout << "mpz operator<< wrong, data[" << i << "]n";
  131.     cout << "  z:     " << data[i].z << "n";
  132.     ABORT ();
  133.   }
  134.       }
  135.     }
  136.   mpz_clear (z);
  137. }
  138. void
  139. check_mpq (void)
  140. {
  141.   static const struct {
  142.     const char     *q;
  143.     const char     *want;
  144.     ios::fmtflags  flags;
  145.     int            width;
  146.     int            precision;
  147.     char           fill;
  148.   } data[] = {
  149.     { "0", "0", ios::dec },
  150.     { "0", "0", ios::hex },
  151.     { "0", "0x0", ios::hex | ios::showbase },
  152.     { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
  153.     { "5/8", "5/8", ios::dec },
  154.     { "5/8", "0X5/0X8", ios::hex | ios::showbase | ios::uppercase },
  155.     // zero denominator with showbase
  156.     { "0/0",   "       0/0", ios::oct | ios::showbase, 10 },
  157.     { "0/0",   "       0/0", ios::dec | ios::showbase, 10 },
  158.     { "0/0",   "   0x0/0x0", ios::hex | ios::showbase, 10 },
  159.     { "123/0", "    0173/0", ios::oct | ios::showbase, 10 },
  160.     { "123/0", "     123/0", ios::dec | ios::showbase, 10 },
  161.     { "123/0", "  0x7b/0x0", ios::hex | ios::showbase, 10 },
  162.     { "123/0", "  0X7B/0X0", ios::hex | ios::showbase | ios::uppercase, 10 },
  163.     { "0/123", "    0/0173", ios::oct | ios::showbase, 10 },
  164.     { "0/123", "     0/123", ios::dec | ios::showbase, 10 },
  165.     { "0/123", "  0x0/0x7b", ios::hex | ios::showbase, 10 },
  166.     { "0/123", "  0X0/0X7B", ios::hex | ios::showbase | ios::uppercase, 10 },
  167.   };
  168.   size_t  i;
  169.   mpq_t   q;
  170.   mpq_init (q);
  171. #define mpq_integer_p(q)  (mpz_cmp_ui (mpq_denref(q), 1L) == 0)
  172.   for (i = 0; i < numberof (data); i++)
  173.     {
  174.       mpq_set_str_or_abort (q, data[i].q, 0);
  175.       MPZ_CHECK_FORMAT (mpq_numref (q));
  176.       MPZ_CHECK_FORMAT (mpq_denref (q));
  177.       if (option_check_standard
  178.   && mpz_fits_slong_p (mpq_numref(q))
  179.   && mpq_integer_p (q))
  180. {
  181.   ostringstream  got;
  182.   long  n = mpz_get_si (mpq_numref(q));
  183.   CALL (got << n);
  184.   if (got.str().compare (data[i].want) != 0)
  185.     {
  186.       cout << "check_mpq data[" << i
  187.    << "] doesn't match standard ostream outputn";
  188.       cout << "  q:     " << data[i].q << "n";
  189.       cout << "  n:     " << n << "n";
  190.       DUMP ();
  191.     }
  192. }
  193.       {
  194. ostringstream  got;
  195. CALL (got << q);
  196. if (got.str().compare (data[i].want) != 0)
  197.   {
  198.     cout << "mpq operator<< wrong, data[" << i << "]n";
  199.     cout << "  q:     " << data[i].q << "n";
  200.     ABORT ();
  201.   }
  202.       }
  203.     }
  204.   mpq_clear (q);
  205. }
  206. void
  207. check_mpf (void)
  208. {
  209.   static const struct {
  210.     const char     *f;
  211.     const char     *want;
  212.     ios::fmtflags  flags;
  213.     int            width;
  214.     int            precision;
  215.     char           fill;
  216.   } data[] = {
  217.     { "0", "0",            ios::dec },
  218.     { "0", "+0",           ios::dec | ios::showpos },
  219.     { "0", "0.00000",      ios::dec | ios::showpoint },
  220.     { "0", "0",            ios::dec | ios::fixed },
  221.     { "0", "0.",           ios::dec | ios::fixed | ios::showpoint },
  222.     { "0", "0.000000e+00", ios::dec | ios::scientific },
  223.     { "0", "0.000000e+00", ios::dec | ios::scientific | ios::showpoint },
  224.     { "0", "0",          ios::dec, 0, 4 },
  225.     { "0", "0.000",      ios::dec | ios::showpoint, 0, 4 },
  226.     { "0", "0.0000",     ios::dec | ios::fixed, 0, 4 },
  227.     { "0", "0.0000",     ios::dec | ios::fixed | ios::showpoint, 0, 4 },
  228.     { "0", "0.0000e+00", ios::dec | ios::scientific, 0, 4 },
  229.     { "0", "0.0000e+00", ios::dec | ios::scientific | ios::showpoint, 0, 4 },
  230.     { "1", "1",       ios::dec },
  231.     { "1", "+1",      ios::dec | ios::showpos },
  232.     { "1", "1.00000", ios::dec | ios::showpoint },
  233.     { "1", "1",       ios::dec | ios::fixed },
  234.     { "1", "1.",      ios::dec | ios::fixed | ios::showpoint },
  235.     { "1", "1.000000e+00",   ios::dec | ios::scientific },
  236.     { "1", "1.000000e+00",  ios::dec | ios::scientific | ios::showpoint },
  237.     { "1", "1",          ios::dec,                   0, 4 },
  238.     { "1", "1.000",      ios::dec | ios::showpoint,  0, 4 },
  239.     { "1", "1.0000",     ios::dec | ios::fixed,      0, 4 },
  240.     { "1", "1.0000",     ios::dec | ios::fixed | ios::showpoint, 0, 4 },
  241.     { "1", "1.0000e+00", ios::dec | ios::scientific, 0, 4 },
  242.     { "1", "1.0000e+00", ios::dec | ios::scientific | ios::showpoint, 0, 4 },
  243.     { "-1", "-1",        ios::dec | ios::showpos },
  244.     { "-1", "  -1",      ios::dec, 4 },
  245.     { "-1", "-  1",      ios::dec | ios::internal, 4 },
  246.     { "-1", "-1  ",      ios::dec | ios::left, 4 },
  247.     { "-1", "  -0x1",    ios::hex | ios::showbase, 6 },
  248.     { "-1", "-0x  1",    ios::hex | ios::showbase | ios::internal, 6 },
  249.     { "-1", "-0x1  ",    ios::hex | ios::showbase | ios::left, 6 },
  250.     {    "1", "*********1", ios::dec, 10, 4, '*' },
  251.     { "1234", "******1234", ios::dec, 10, 4, '*' },
  252.     { "1234", "*****1234.", ios::dec | ios::showpoint, 10, 4, '*' },
  253.     { "12345", "1.23e+04", ios::dec, 0, 3 },
  254.     { "12345", "12345.", ios::dec | ios::fixed | ios::showpoint },
  255.     { "1.9999999",    "2",     ios::dec, 0, 1 },
  256.     { "1.0009999999", "1.001", ios::dec, 0, 4 },
  257.     { "1.0001",       "1",     ios::dec, 0, 4 },
  258.     { "1.0004",       "1",     ios::dec, 0, 4 },
  259.     { "1.000555",     "1.001", ios::dec, 0, 4 },
  260.     { "1.0002",       "1.000", ios::dec | ios::fixed, 0, 3 },
  261.     { "1.0008",       "1.001", ios::dec | ios::fixed, 0, 3 },
  262.     { "0", "0", ios::hex },
  263.     { "0", "0x0", ios::hex | ios::showbase },
  264.     { "0", "0X0", ios::hex | ios::showbase | ios::uppercase },
  265.     { "123",   "7b", ios::hex },
  266.     { "123", "0x7b", ios::hex | ios::showbase },
  267.     { "123", "0X7B", ios::hex | ios::showbase | ios::uppercase },
  268.     { "0", "0.000@+00", ios::hex | ios::scientific, 0, 3 },
  269.     { "256", "1.000@+02", ios::hex | ios::scientific, 0, 3 },
  270.     { "123",   "7.b@+01", ios::hex | ios::scientific, 0, 1 },
  271.     { "123",   "7.B@+01", ios::hex | ios::scientific | ios::uppercase, 0, 1 },
  272.     { "123", "0x7.b@+01", ios::hex | ios::scientific | ios::showbase, 0, 1 },
  273.     { "123", "0X7.B@+01",
  274.       ios::hex | ios::scientific | ios::showbase | ios::uppercase, 0, 1 },
  275.     { "1099511627776", "1.0@+10", ios::hex | ios::scientific, 0, 1 },
  276.     { "1099511627776", "1.0@+10",
  277.       ios::hex | ios::scientific | ios::uppercase, 0, 1 },
  278.     { "0.0625", "1.00@-01", ios::hex | ios::scientific, 0, 2 },
  279.     { "0", "0", ios::oct },
  280.     { "123",  "173", ios::oct },
  281.     { "123", "0173", ios::oct | ios::showbase },
  282.     // octal showbase suppressed for 0
  283.     { "0", "0", ios::oct | ios::showbase },
  284.     { ".125",    "00.1",  ios::oct | ios::showbase, 0, 1 },
  285.     { ".015625", "00.01", ios::oct | ios::showbase, 0, 2 },
  286.     { ".125",    "00.1",  ios::fixed | ios::oct | ios::showbase, 0, 1 },
  287.     { ".015625", "0.0",   ios::fixed | ios::oct | ios::showbase, 0, 1 },
  288.     { ".015625", "00.01", ios::fixed | ios::oct | ios::showbase, 0, 2 },
  289.     {  "0.125",  "1.000000e-01", ios::oct | ios::scientific },
  290.     {  "0.125", "+1.000000e-01", ios::oct | ios::scientific | ios::showpos },
  291.     { "-0.125", "-1.000000e-01", ios::oct | ios::scientific },
  292.     { "-0.125", "-1.000000e-01", ios::oct | ios::scientific | ios::showpos },
  293.     { "0", "0.000e+00", ios::oct | ios::scientific, 0, 3 },
  294.     { "256",  "4.000e+02", ios::oct | ios::scientific, 0, 3 },
  295.     { "256", "04.000e+02", ios::oct | ios::scientific | ios::showbase, 0, 3 },
  296.     { "256",  "4.000E+02", ios::oct | ios::scientific | ios::uppercase, 0, 3 },
  297.     { "256", "04.000E+02",
  298.       ios::oct | ios::scientific | ios::showbase | ios::uppercase, 0, 3 },
  299.     { "16777216",    "1.000000e+08", ios::oct | ios::scientific },
  300.     { "16777216",    "1.000000E+08",
  301.       ios::oct | ios::scientific | ios::uppercase },
  302.     { "16777216",   "01.000000e+08",
  303.       ios::oct | ios::scientific | ios::showbase },
  304.     { "16777216",   "01.000000E+08",
  305.       ios::oct | ios::scientific | ios::showbase | ios::uppercase },
  306.     { "16777216",  "+01.000000e+08",
  307.       ios::oct | ios::scientific | ios::showbase | ios::showpos },
  308.     { "16777216",  "+01.000000E+08", ios::oct | ios::scientific
  309.       | ios::showbase | ios::showpos | ios::uppercase },
  310.     { "-16777216", "-01.000000e+08",
  311.       ios::oct | ios::scientific | ios::showbase | ios::showpos },
  312.     { "-16777216", "-01.000000E+08", ios::oct | ios::scientific
  313.       | ios::showbase | ios::showpos | ios::uppercase },
  314.   };
  315.   size_t  i;
  316.   mpf_t   f, f2;
  317.   double  d;
  318.   mpf_init (f);
  319.   mpf_init (f2);
  320.   for (i = 0; i < numberof (data); i++)
  321.     {
  322.       mpf_set_str_or_abort (f, data[i].f, 0);
  323.       d = mpf_get_d (f);
  324.       mpf_set_d (f2, d);
  325.       if (option_check_standard && mpf_cmp (f, f2) == 0
  326.   && ! (data[i].flags & (ios::hex | ios::oct | ios::showbase)))
  327. {
  328.   ostringstream  got;
  329.   CALL (got << d);
  330.   if (got.str().compare (data[i].want) != 0)
  331.     {
  332.       cout << "check_mpf data[" << i
  333.    << "] doesn't match standard ostream outputn";
  334.       cout << "  f:     " << data[i].f << "n";
  335.       cout << "  d:     " << d << "n";
  336.       DUMP ();
  337.     }
  338. }
  339.       {
  340. ostringstream  got;
  341. CALL (got << f);
  342. if (got.str().compare (data[i].want) != 0)
  343.   {
  344.     cout << "mpf operator<< wrong, data[" << i << "]n";
  345.     cout << "  f:     " << data[i].f << "n";
  346.     ABORT ();
  347.   }
  348.       }
  349.     }
  350.   mpf_clear (f);
  351.   mpf_clear (f2);
  352. }
  353. int
  354. main (int argc, char *argv[])
  355. {
  356.   if (argc > 1 && strcmp (argv[1], "-s") == 0)
  357.     option_check_standard = 1;
  358.   tests_start ();
  359.   check_mpz ();
  360.   check_mpq ();
  361.   check_mpf ();
  362.   tests_end ();
  363.   return 0;
  364. }