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

数学计算

开发平台:

Unix_Linux

  1. /* Test that routines allow reusing a source variable as destination.
  2. Copyright 1996, 2000, 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 <string.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. #if __GMP_LIBGMP_DLL
  21. /* FIXME: When linking to a DLL libgmp, mpf_add etc can't be used as
  22.    initializers for global variables because they're effectively global
  23.    variables (function pointers) themselves.  Perhaps calling a test
  24.    function successively with mpf_add etc would be better.  */
  25. int
  26. main (void)
  27. {
  28.   printf ("Test suppressed for windows DLLn");
  29.   exit (0);
  30. }
  31. #else /* ! DLL_EXPORT */
  32. #ifndef SIZE
  33. #define SIZE 16
  34. #endif
  35. #ifndef EXPO
  36. #define EXPO 32
  37. #endif
  38. void dump_abort __GMP_PROTO ((char *, mpf_t, mpf_t));
  39. typedef void (*dss_func) __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
  40. dss_func dss_funcs[] =
  41. {
  42.   mpf_div, mpf_add, mpf_mul, mpf_sub,
  43. };
  44. char *dss_func_names[] =
  45. {
  46.   "mpf_div", "mpf_add", "mpf_mul", "mpf_sub",
  47. };
  48. typedef void (*dsi_func) __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
  49. dsi_func dsi_funcs[] =
  50. {
  51.   mpf_div_ui, mpf_add_ui, mpf_mul_ui, mpf_sub_ui,
  52.   mpf_mul_2exp, mpf_div_2exp
  53. };
  54. char *dsi_func_names[] =
  55. {
  56.   "mpf_div_ui", "mpf_add_ui", "mpf_mul_ui", "mpf_sub_ui",
  57.   "mpf_mul_2exp", "mpf_div_2exp"
  58. };
  59. typedef void (*dis_func) __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
  60. dis_func dis_funcs[] =
  61. {
  62.   mpf_ui_div, mpf_ui_sub,
  63. };
  64. char *dis_func_names[] =
  65. {
  66.   "mpf_ui_div", "mpf_ui_sub",
  67. };
  68. int
  69. main (int argc, char **argv)
  70. {
  71.   int i;
  72.   int pass, reps = 10000;
  73.   mpf_t in1, in2, out1;
  74.   unsigned long int in1i, in2i;
  75.   mpf_t res1, res2, res3;
  76.   mp_size_t bprec = 100;
  77.   tests_start ();
  78.   if (argc > 1)
  79.     {
  80.       reps = strtol (argv[1], 0, 0);
  81.       if (argc > 2)
  82. bprec = strtol (argv[2], 0, 0);
  83.     }
  84.   mpf_set_default_prec (bprec);
  85.   mpf_init (in1);
  86.   mpf_init (in2);
  87.   mpf_init (out1);
  88.   mpf_init (res1);
  89.   mpf_init (res2);
  90.   mpf_init (res3);
  91.   for (pass = 1; pass <= reps; pass++)
  92.     {
  93.       mpf_random2 (in1, urandom () % SIZE - SIZE/2, urandom () % EXPO);
  94.       mpf_random2 (in2, urandom () % SIZE - SIZE/2, urandom () % EXPO);
  95.       for (i = 0; i < sizeof (dss_funcs) / sizeof (dss_func); i++)
  96. {
  97.   /* Don't divide by 0.  */
  98.   if (i == 0 && mpf_cmp_ui (in2, 0) == 0)
  99.     continue;
  100.   (dss_funcs[i]) (res1, in1, in2);
  101.   mpf_set (out1, in1);
  102.   (dss_funcs[i]) (out1, out1, in2);
  103.   mpf_set (res2, out1);
  104.   mpf_set (out1, in2);
  105.   (dss_funcs[i]) (out1, in1, out1);
  106.   mpf_set (res3, out1);
  107.   if (mpf_cmp (res1, res2) != 0)
  108.     dump_abort (dss_func_names[i], res1, res2);
  109.   if (mpf_cmp (res1, res3) != 0)
  110.     dump_abort (dss_func_names[i], res1, res3);
  111. }
  112.       in2i = urandom ();
  113.       for (i = 0; i < sizeof (dsi_funcs) / sizeof (dsi_func); i++)
  114. {
  115.   /* Don't divide by 0.  */
  116.   if (strcmp (dsi_func_names[i], "mpf_div_ui") == 0 && in2i == 0)
  117.     continue;
  118.   (dsi_funcs[i]) (res1, in1, in2i);
  119.   mpf_set (out1, in1);
  120.   (dsi_funcs[i]) (out1, out1, in2i);
  121.   mpf_set (res2, out1);
  122.   if (mpf_cmp (res1, res2) != 0)
  123.     dump_abort (dsi_func_names[i], res1, res2);
  124. }
  125.       in1i = urandom ();
  126.       for (i = 0; i < sizeof (dis_funcs) / sizeof (dis_func); i++)
  127. {
  128.   /* Don't divide by 0.  */
  129.   if (strcmp (dis_func_names[i], "mpf_ui_div") == 0
  130.       && mpf_cmp_ui (in2, 0) == 0)
  131.     continue;
  132.   (dis_funcs[i]) (res1, in1i, in2);
  133.   mpf_set (out1, in2);
  134.   (dis_funcs[i]) (out1, in1i, out1);
  135.   mpf_set (res2, out1);
  136.   if (mpf_cmp (res1, res2) != 0)
  137.     dump_abort (dis_func_names[i], res1, res2);
  138. }
  139.     }
  140.   mpf_clear (in1);
  141.   mpf_clear (in2);
  142.   mpf_clear (out1);
  143.   mpf_clear (res1);
  144.   mpf_clear (res2);
  145.   mpf_clear (res3);
  146.   tests_end ();
  147.   exit (0);
  148. }
  149. void
  150. dump_abort (char *name, mpf_t res1, mpf_t res2)
  151. {
  152.   printf ("failure in %s:n", name);
  153.   mpf_dump (res1);
  154.   mpf_dump (res2);
  155.   abort ();
  156. }
  157. #if 0
  158. void mpf_abs __GMP_PROTO ((mpf_ptr, mpf_srcptr));
  159. void mpf_sqrt __GMP_PROTO ((mpf_ptr, mpf_srcptr));
  160. void mpf_neg __GMP_PROTO ((mpf_ptr, mpf_srcptr));
  161. #endif
  162. #endif /* ! DLL_EXPORT */