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

数学计算

开发平台:

Unix_Linux

  1. /* Test precision of mpf_class expressions.
  2. Copyright 2001, 2002, 2003, 2008 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 <iostream>
  16. #include "gmp.h"
  17. #include "gmpxx.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. using namespace std;
  21. const int
  22. small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256;
  23. #define ASSERT_ALWAYS_PREC(a, s, prec) 
  24. {                                      
  25.   mpf_srcptr _a = a.get_mpf_t();       
  26.   mpf_class _b(s, prec);               
  27.   mpf_srcptr _c = _b.get_mpf_t();      
  28.   ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); 
  29. }
  30. void
  31. check_mpf (void)
  32. {
  33.   mpf_set_default_prec(medium_prec);
  34.   // simple expressions
  35.   {
  36.     mpf_class f(3.0, small_prec);
  37.     mpf_class g(1 / f, very_large_prec);
  38.     ASSERT_ALWAYS_PREC
  39.       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  40.        "     33333 33333 33333 33333 33333 333", very_large_prec);
  41.   }
  42.   {
  43.     mpf_class f(9.0, medium_prec);
  44.     mpf_class g(0.0, very_large_prec);
  45.     g = 1 / f;
  46.     ASSERT_ALWAYS_PREC
  47.       (g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111"
  48.        "     11111 11111 11111 11111 11111 111", very_large_prec);
  49.   }
  50.   {
  51.     mpf_class f(15.0, large_prec);
  52.     mpf_class g(0.0, very_large_prec);
  53.     g = 1 / f;
  54.     ASSERT_ALWAYS_PREC
  55.       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  56.        "     66666 66666 66666 66666 66666 667", very_large_prec);
  57.   }
  58.   // compound expressions
  59.   {
  60.     mpf_class f(3.0, small_prec);
  61.     mpf_class g(-(-(-1 / f)), very_large_prec);
  62.     ASSERT_ALWAYS_PREC
  63.       (g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  64.        "      33333 33333 33333 33333 33333 333", very_large_prec);
  65.   }
  66.   {
  67.     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
  68.     mpf_class h(0.0, very_large_prec);
  69.     h = 1/f + 1/g;
  70.     ASSERT_ALWAYS_PREC
  71.       (h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444"
  72.        "     44444 44444 44444 44444 44444 444", very_large_prec);
  73.   }
  74.   {
  75.     mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec);
  76.     mpf_class i(0.0, very_large_prec);
  77.     i = f / g + h;
  78.     ASSERT_ALWAYS_PREC
  79.       (i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  80.        "      33333 33333 33333 33333 33333 3", very_large_prec);
  81.   }
  82.   {
  83.     mpf_class f(3.0, small_prec);
  84.     mpf_class g(-(1 + f) / 3, very_large_prec);
  85.     ASSERT_ALWAYS_PREC
  86.       (g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  87.        "      33333 33333 33333 33333 33333 33", very_large_prec);
  88.   }
  89.   {
  90.     mpf_class f(9.0, medium_prec);
  91.     mpf_class g(0.0, very_large_prec);
  92.     g = sqrt(1 / f);
  93.     ASSERT_ALWAYS_PREC
  94.       (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  95.        "     33333 33333 33333 33333 33333 333", very_large_prec);
  96.   }
  97.   {
  98.     mpf_class f(15.0, large_prec);
  99.     mpf_class g(0.0, very_large_prec);
  100.     g = hypot(1 + 5 / f, 1.0);
  101.     ASSERT_ALWAYS_PREC
  102.       (g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  103.        "     66666 66666 66666 66666 66666 67", very_large_prec);
  104.   }
  105.   // compound assignments
  106.   {
  107.     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
  108.     mpf_class h(1.0, very_large_prec);
  109.     h -= f / g;
  110.     ASSERT_ALWAYS_PREC
  111.       (h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  112.        "     66666 66666 66666 66666 66666 667", very_large_prec);
  113.   }
  114.   // construction from expressions
  115.   {
  116.     mpf_class f(3.0, small_prec);
  117.     mpf_class g(0.0, very_large_prec);
  118.     g = mpf_class(1 / f);
  119.     ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec);
  120.   }
  121.   {
  122.     mpf_class f(9.0, medium_prec);
  123.     mpf_class g(0.0, very_large_prec);
  124.     g = mpf_class(1 / f);
  125.     ASSERT_ALWAYS_PREC
  126.       (g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec);
  127.   }
  128.   {
  129.     mpf_class f(15.0, large_prec);
  130.     mpf_class g(0.0, very_large_prec);
  131.     g = mpf_class(1 / f);
  132.     ASSERT_ALWAYS_PREC
  133.       (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  134.        "     66666 6667", large_prec);
  135.   }
  136.   {
  137.     mpf_class f(3.0, small_prec), g(9.0, medium_prec);
  138.     mpf_class h(0.0, very_large_prec);
  139.     h = mpf_class(f / g + 1, large_prec);
  140.     ASSERT_ALWAYS_PREC
  141.       (h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  142.        "     33333 333",
  143.        large_prec);
  144.   }
  145.   // mixed mpf/mpq expressions
  146.   {
  147.     mpf_class f(3.0, small_prec);
  148.     mpq_class q(1, 3);
  149.     mpf_class g(0.0, very_large_prec);
  150.     g = f - q;
  151.     ASSERT_ALWAYS_PREC
  152.       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  153.        "     66666 66666 66666 66666 66666 67", very_large_prec);
  154.   }
  155.   {
  156.     mpf_class f(3.0, small_prec);
  157.     mpq_class q(1, 3);
  158.     mpf_class g(0.0, very_large_prec);
  159.     g = mpf_class(f - q, large_prec);
  160.     ASSERT_ALWAYS_PREC
  161.       (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
  162.        "     66666 667",
  163.        large_prec);
  164.   }
  165.   {
  166.     mpf_class f(3.0, small_prec);
  167.     mpq_class q(1, 3);
  168.     mpf_class g(0.0, very_large_prec);
  169.     g = mpf_class(f - q);
  170.     ASSERT_ALWAYS_PREC
  171.       (g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec);
  172.   }
  173.   {
  174.     mpf_class f(15.0, large_prec);
  175.     mpq_class q(1, 3);
  176.     mpf_class g(0.0, very_large_prec);
  177.     g = mpf_class(f + q);
  178.     ASSERT_ALWAYS_PREC
  179.       (g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
  180.        "      33333 33",
  181.        large_prec);
  182.   }
  183. }
  184. int
  185. main (void)
  186. {
  187.   tests_start();
  188.   check_mpf();
  189.   tests_end();
  190.   return 0;
  191. }