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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_get_d and mpf_set_d.
  2.    Copyright 1996, 1999, 2000, 2001, 2009 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 "gmp.h"
  17. #include "tests.h"
  18. #if defined (__vax__)
  19. #define LOW_BOUND 1e-38
  20. #define HIGH_BOUND 8e37
  21. #endif
  22. #if defined (_CRAY) && ! defined (_CRAYIEEE)
  23. /* The range varies mysteriously between Cray version.  On an SV1,
  24.    the range seem to be 1e-600..1e603, but a cfp (non-ieee) T90
  25.    has a much smaller range of 1e-240..1e240.  */
  26. #define LOW_BOUND 1e-240
  27. #define HIGH_BOUND 1e240
  28. #endif
  29. #if ! defined (LOW_BOUND)
  30. #define LOW_BOUND 1e-300
  31. #define HIGH_BOUND 1e300
  32. #endif
  33. void
  34. test_denorms (int prc)
  35. {
  36. #ifdef _GMP_IEEE_FLOATS
  37.   double d1, d2;
  38.   mpf_t f;
  39.   int i;
  40.   mpf_set_default_prec (prc);
  41.   mpf_init (f);
  42.   d1 = 1.9;
  43.   for (i = 0; i < 820; i++)
  44.     {
  45.       mpf_set_d (f, d1);
  46.       d2 = mpf_get_d (f);
  47.       if (d1 != d2)
  48.         abort ();
  49.       d1 *= 0.4;
  50.     }
  51.   mpf_clear (f);
  52. #endif
  53. }
  54. int
  55. main (int argc, char **argv)
  56. {
  57.   double d, e, r;
  58.   mpf_t u, v;
  59.   tests_start ();
  60.   mpf_init (u);
  61.   mpf_init (v);
  62.   mpf_set_d (u, LOW_BOUND);
  63.   for (d = 2.0 * LOW_BOUND; d < HIGH_BOUND; d *= 1.01)
  64.     {
  65.       mpf_set_d (v, d);
  66.       if (mpf_cmp (u, v) >= 0)
  67. abort ();
  68.       e = mpf_get_d (v);
  69.       r = e/d;
  70.       if (r < 0.99999999999999 || r > 1.00000000000001)
  71. {
  72.   fprintf (stderr, "should be one ulp from 1: %.16fn", r);
  73.   abort ();
  74. }
  75.       mpf_set (u, v);
  76.     }
  77.   mpf_clear (u);
  78.   mpf_clear (v);
  79.   test_denorms (10);
  80.   test_denorms (32);
  81.   test_denorms (64);
  82.   test_denorms (100);
  83.   test_denorms (200);
  84.   tests_end ();
  85.   exit (0);
  86. }