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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpq_add and mpq_sub.
  2. Copyright 2001 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 "config.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "gmp.h"
  19. #include "gmp-impl.h"
  20. #include "tests.h"
  21. void
  22. check_all (mpq_ptr x, mpq_ptr y, mpq_ptr want_add, mpq_ptr want_sub)
  23. {
  24.   mpq_t  got;
  25.   int    neg_x, neg_y, swap;
  26.   mpq_init (got);
  27.   MPQ_CHECK_FORMAT (want_add);
  28.   MPQ_CHECK_FORMAT (want_sub);
  29.   MPQ_CHECK_FORMAT (x);
  30.   MPQ_CHECK_FORMAT (y);
  31.   for (swap = 0; swap <= 1; swap++)
  32.     {
  33.       for (neg_x = 0; neg_x <= 1; neg_x++)
  34.         {
  35.           for (neg_y = 0; neg_y <= 1; neg_y++)
  36.             {
  37.               mpq_add (got, x, y);
  38.               MPQ_CHECK_FORMAT (got);
  39.               if (! mpq_equal (got, want_add))
  40.                 {
  41.                   printf ("mpq_add wrongn");
  42.                   mpq_trace ("  x   ", x);
  43.                   mpq_trace ("  y   ", y);
  44.                   mpq_trace ("  got ", got);
  45.                   mpq_trace ("  want", want_add);
  46.                   abort ();
  47.                 }
  48.               mpq_sub (got, x, y);
  49.               MPQ_CHECK_FORMAT (got);
  50.               if (! mpq_equal (got, want_sub))
  51.                 {
  52.                   printf ("mpq_sub wrongn");
  53.                   mpq_trace ("  x   ", x);
  54.                   mpq_trace ("  y   ", y);
  55.                   mpq_trace ("  got ", got);
  56.                   mpq_trace ("  want", want_sub);
  57.                   abort ();
  58.                 }
  59.               mpq_neg (y, y);
  60.               mpq_swap (want_add, want_sub);
  61.             }
  62.           mpq_neg (x, x);
  63.           mpq_swap (want_add, want_sub);
  64.           mpq_neg (want_add, want_add);
  65.           mpq_neg (want_sub, want_sub);
  66.         }
  67.       mpq_swap (x, y);
  68.       mpq_neg (want_sub, want_sub);
  69.     }
  70.   mpq_clear (got);
  71. }
  72. void
  73. check_data (void)
  74. {
  75.   static const struct {
  76.     const char  *x;
  77.     const char  *y;
  78.     const char  *want_add;
  79.     const char  *want_sub;
  80.   } data[] = {
  81.     { "0", "0", "0", "0" },
  82.     { "1", "0", "1", "1" },
  83.     { "1", "1", "2", "0" },
  84.     { "1/2", "1/2", "1", "0" },
  85.     { "5/6", "14/15", "53/30", "-1/10" },
  86.   };
  87.   mpq_t  x, y, want_add, want_sub;
  88.   int i;
  89.   mpq_init (x);
  90.   mpq_init (y);
  91.   mpq_init (want_add);
  92.   mpq_init (want_sub);
  93.   for (i = 0; i < numberof (data); i++)
  94.     {
  95.       mpq_set_str_or_abort (x, data[i].x, 0);
  96.       mpq_set_str_or_abort (y, data[i].y, 0);
  97.       mpq_set_str_or_abort (want_add, data[i].want_add, 0);
  98.       mpq_set_str_or_abort (want_sub, data[i].want_sub, 0);
  99.       check_all (x, y, want_add, want_sub);
  100.     }
  101.   mpq_clear (x);
  102.   mpq_clear (y);
  103.   mpq_clear (want_add);
  104.   mpq_clear (want_sub);
  105. }
  106. void
  107. check_rand (void)
  108. {
  109.   mpq_t  x, y, want_add, want_sub;
  110.   int i;
  111.   gmp_randstate_ptr  rands = RANDS;
  112.   mpq_init (x);
  113.   mpq_init (y);
  114.   mpq_init (want_add);
  115.   mpq_init (want_sub);
  116.   for (i = 0; i < 500; i++)
  117.     {
  118.       mpz_errandomb (mpq_numref(x), rands, 512L);
  119.       mpz_errandomb_nonzero (mpq_denref(x), rands, 512L);
  120.       mpq_canonicalize (x);
  121.       mpz_errandomb (mpq_numref(y), rands, 512L);
  122.       mpz_errandomb_nonzero (mpq_denref(y), rands, 512L);
  123.       mpq_canonicalize (y);
  124.       refmpq_add (want_add, x, y);
  125.       refmpq_sub (want_sub, x, y);
  126.       check_all (x, y, want_add, want_sub);
  127.     }
  128.   mpq_clear (x);
  129.   mpq_clear (y);
  130.   mpq_clear (want_add);
  131.   mpq_clear (want_sub);
  132. }
  133. int
  134. main (void)
  135. {
  136.   tests_start ();
  137.   check_data ();
  138.   check_rand ();
  139.   tests_end ();
  140.   exit (0);
  141. }