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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_get_d_2exp.
  2. Copyright 2002, 2003 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 "gmp-impl.h"
  18. #include "tests.h"
  19. static void
  20. check_onebit (void)
  21. {
  22.   static const long data[] = {
  23.     -513, -512, -511, -65, -64, -63, -32, -1,
  24.     0, 1, 32, 53, 54, 64, 128, 256, 511, 512, 513
  25.   };
  26.   mpf_t   f;
  27.   double  got, want;
  28.   long    got_exp, want_exp;
  29.   int     i;
  30.   mpf_init2 (f, 1024L);
  31.   for (i = 0; i < numberof (data); i++)
  32.     {
  33.       mpf_set_ui (f, 1L);
  34.       if (data[i] >= 0)
  35.         mpf_mul_2exp (f, f, data[i]);
  36.       else
  37.         mpf_div_2exp (f, f, -data[i]);
  38.       want = 0.5;
  39.       want_exp = data[i] + 1;
  40.       got = mpf_get_d_2exp (&got_exp, f);
  41.       if (got != want || got_exp != want_exp)
  42.         {
  43.           printf    ("mpf_get_d_2exp wrong on 2**%ldn", data[i]);
  44.           mpf_trace ("   f    ", f);
  45.           d_trace   ("   want ", want);
  46.           d_trace   ("   got  ", got);
  47.           printf    ("   want exp %ldn", want_exp);
  48.           printf    ("   got exp  %ldn", got_exp);
  49.           abort();
  50.         }
  51.     }
  52.   mpf_clear (f);
  53. }
  54. /* Check that hardware rounding doesn't make mpf_get_d_2exp return a value
  55.    outside its defined range. */
  56. static void
  57. check_round (void)
  58. {
  59.   static const unsigned long data[] = { 1, 32, 53, 54, 64, 128, 256, 512 };
  60.   mpf_t   f;
  61.   double  got;
  62.   long    got_exp;
  63.   int     i, rnd_mode, old_rnd_mode;
  64.   mpf_init2 (f, 1024L);
  65.   old_rnd_mode = tests_hardware_getround ();
  66.   for (rnd_mode = 0; rnd_mode < 4; rnd_mode++)
  67.     {
  68.       tests_hardware_setround (rnd_mode);
  69.       for (i = 0; i < numberof (data); i++)
  70.         {
  71.           mpf_set_ui (f, 1L);
  72.           mpf_mul_2exp (f, f, data[i]);
  73.           mpf_sub_ui (f, f, 1L);
  74.           got = mpf_get_d_2exp (&got_exp, f);
  75.           if (got < 0.5 || got >= 1.0)
  76.             {
  77.               printf    ("mpf_get_d_2exp bad on 2**%lu-1n", data[i]);
  78.               printf    ("result out of range, expect 0.5 <= got < 1.0n");
  79.               printf    ("   rnd_mode = %dn", rnd_mode);
  80.               printf    ("   data[i]  = %lun", data[i]);
  81.               mpf_trace ("   f    ", f);
  82.               d_trace   ("   got  ", got);
  83.               printf    ("   got exp  %ldn", got_exp);
  84.               abort();
  85.             }
  86.         }
  87.     }
  88.   mpf_clear (f);
  89.   tests_hardware_setround (old_rnd_mode);
  90. }
  91. int
  92. main (void)
  93. {
  94.   tests_start ();
  95.   mp_trace_base = 16;
  96.   check_onebit ();
  97.   check_round ();
  98.   tests_end ();
  99.   exit (0);
  100. }