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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_trunc, mpf_ceil, mpf_floor.
  2. Copyright 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 "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. void
  20. check_print (mpf_srcptr src, mpf_srcptr got, mpf_srcptr want)
  21. {
  22.   mp_trace_base = 16;
  23.   mpf_trace ("src ", src);
  24.   mpf_trace ("got ", got);
  25.   mpf_trace ("want", want);
  26.   printf ("got  size=%d exp=%ldn", SIZ(got), EXP(got));
  27.   mpn_trace ("     limbs=", PTR(got), (mp_size_t) ABSIZ(got));
  28.   printf ("want size=%d exp=%ldn", SIZ(want), EXP(want));
  29.   mpn_trace ("     limbs=", PTR(want), (mp_size_t) ABSIZ(want));
  30. }
  31. void
  32. check_one (mpf_srcptr src, mpf_srcptr trunc, mpf_srcptr ceil, mpf_srcptr floor)
  33. {
  34.   mpf_t  got;
  35.   mpf_init2 (got, mpf_get_prec (trunc));
  36.   ASSERT_ALWAYS (PREC(got) == PREC(trunc));
  37.   ASSERT_ALWAYS (PREC(got) == PREC(ceil));
  38.   ASSERT_ALWAYS (PREC(got) == PREC(floor));
  39. #define CHECK_SEP(name, fun, want)              
  40.   mpf_set_ui (got, 54321L); /* initial junk */  
  41.   fun (got, src);                               
  42.   MPF_CHECK_FORMAT (got);                       
  43.   if (mpf_cmp (got, want) != 0)                 
  44.     {                                           
  45. printf ("%s wrongn", name);            
  46. check_print (src, got, want);           
  47. abort ();                               
  48.     }
  49.   CHECK_SEP ("mpf_trunc", mpf_trunc, trunc);
  50.   CHECK_SEP ("mpf_ceil",  mpf_ceil,  ceil);
  51.   CHECK_SEP ("mpf_floor", mpf_floor, floor);
  52. #define CHECK_INPLACE(name, fun, want)  
  53.   mpf_set (got, src);                   
  54.   fun (got, got);                       
  55.   MPF_CHECK_FORMAT (got);               
  56.   if (mpf_cmp (got, want) != 0)         
  57.     {                                   
  58. printf ("%s wrongn", name);    
  59. check_print (src, got, want);   
  60. abort ();                       
  61.     }
  62.   CHECK_INPLACE ("mpf_trunc", mpf_trunc, trunc);
  63.   /* Can't do these unconditionally in case truncation by mpf_set strips
  64.      some low non-zero limbs which would have rounded the result.  */
  65.   if (ABSIZ(src) <= PREC(trunc)+1)
  66.     {
  67.       CHECK_INPLACE ("mpf_ceil",  mpf_ceil,  ceil);
  68.       CHECK_INPLACE ("mpf_floor", mpf_floor, floor);
  69.     }
  70.   mpf_clear (got);
  71. }
  72. void
  73. check_all (mpf_ptr src, mpf_ptr trunc, mpf_ptr ceil, mpf_ptr floor)
  74. {
  75.   /* some of these values are generated with direct field assignments */
  76.   MPF_CHECK_FORMAT (src);
  77.   MPF_CHECK_FORMAT (trunc);
  78.   MPF_CHECK_FORMAT (ceil);
  79.   MPF_CHECK_FORMAT (floor);
  80.   check_one (src, trunc, ceil, floor);
  81.   mpf_neg (src,   src);
  82.   mpf_neg (trunc, trunc);
  83.   mpf_neg (ceil,  ceil);
  84.   mpf_neg (floor, floor);
  85.   check_one (src, trunc, floor, ceil);
  86. }
  87. void
  88. check_various (void)
  89. {
  90.   mpf_t  src, trunc, ceil, floor;
  91.   int    n, i;
  92.   mpf_init2 (src, 512L);
  93.   mpf_init2 (trunc, 256L);
  94.   mpf_init2 (ceil,  256L);
  95.   mpf_init2 (floor, 256L);
  96.   /* 0 */
  97.   mpf_set_ui (src, 0L);
  98.   mpf_set_ui (trunc, 0L);
  99.   mpf_set_ui (ceil, 0L);
  100.   mpf_set_ui (floor, 0L);
  101.   check_all (src, trunc, ceil, floor);
  102.   /* 1 */
  103.   mpf_set_ui (src, 1L);
  104.   mpf_set_ui (trunc, 1L);
  105.   mpf_set_ui (ceil, 1L);
  106.   mpf_set_ui (floor, 1L);
  107.   check_all (src, trunc, ceil, floor);
  108.   /* 2^1024 */
  109.   mpf_set_ui (src, 1L);
  110.   mpf_mul_2exp (src,   src,   1024L);
  111.   mpf_set (trunc, src);
  112.   mpf_set (ceil,  src);
  113.   mpf_set (floor, src);
  114.   check_all (src, trunc, ceil, floor);
  115.   /* 1/2^1024, fraction only */
  116.   mpf_set_ui (src, 1L);
  117.   mpf_div_2exp (src,  src, 1024L);
  118.   mpf_set_si (trunc, 0L);
  119.   mpf_set_si (ceil, 1L);
  120.   mpf_set_si (floor, 0L);
  121.   check_all (src, trunc, ceil, floor);
  122.   /* 1/2 */
  123.   mpf_set_ui (src, 1L);
  124.   mpf_div_2exp (src,  src, 1L);
  125.   mpf_set_si (trunc, 0L);
  126.   mpf_set_si (ceil, 1L);
  127.   mpf_set_si (floor, 0L);
  128.   check_all (src, trunc, ceil, floor);
  129.   /* 123+1/2^64 */
  130.   mpf_set_ui (src, 1L);
  131.   mpf_div_2exp (src,  src, 64L);
  132.   mpf_add_ui (src,  src, 123L);
  133.   mpf_set_si (trunc, 123L);
  134.   mpf_set_si (ceil, 124L);
  135.   mpf_set_si (floor, 123L);
  136.   check_all (src, trunc, ceil, floor);
  137.   /* integer of full prec+1 limbs, unchanged */
  138.   n = PREC(trunc)+1;
  139.   ASSERT_ALWAYS (n <= PREC(src)+1);
  140.   EXP(src) = n;
  141.   SIZ(src) = n;
  142.   for (i = 0; i < SIZ(src); i++)
  143.     PTR(src)[i] = i+100;
  144.   mpf_set (trunc, src);
  145.   mpf_set (ceil, src);
  146.   mpf_set (floor, src);
  147.   check_all (src, trunc, ceil, floor);
  148.   /* full prec+1 limbs, 1 trimmed for integer */
  149.   n = PREC(trunc)+1;
  150.   ASSERT_ALWAYS (n <= PREC(src)+1);
  151.   EXP(src) = n-1;
  152.   SIZ(src) = n;
  153.   for (i = 0; i < SIZ(src); i++)
  154.     PTR(src)[i] = i+200;
  155.   EXP(trunc) = n-1;
  156.   SIZ(trunc) = n-1;
  157.   for (i = 0; i < SIZ(trunc); i++)
  158.     PTR(trunc)[i] = i+201;
  159.   mpf_set (floor, trunc);
  160.   mpf_add_ui (ceil, trunc, 1L);
  161.   check_all (src, trunc, ceil, floor);
  162.   /* prec+3 limbs, 2 trimmed for size */
  163.   n = PREC(trunc)+3;
  164.   ASSERT_ALWAYS (n <= PREC(src)+1);
  165.   EXP(src) = n;
  166.   SIZ(src) = n;
  167.   for (i = 0; i < SIZ(src); i++)
  168.     PTR(src)[i] = i+300;
  169.   EXP(trunc) = n;
  170.   SIZ(trunc) = n-2;
  171.   for (i = 0; i < SIZ(trunc); i++)
  172.     PTR(trunc)[i] = i+302;
  173.   mpf_set (floor, trunc);
  174.   mpf_set (ceil, trunc);
  175.   PTR(ceil)[0]++;
  176.   check_all (src, trunc, ceil, floor);
  177.   /* prec+4 limbs, 2 trimmed for size, 1 trimmed for integer */
  178.   n = PREC(trunc)+4;
  179.   ASSERT_ALWAYS (n <= PREC(src)+1);
  180.   EXP(src) = n-1;
  181.   SIZ(src) = n;
  182.   for (i = 0; i < SIZ(src); i++)
  183.     PTR(src)[i] = i+400;
  184.   EXP(trunc) = n-1;
  185.   SIZ(trunc) = n-3;
  186.   for (i = 0; i < SIZ(trunc); i++)
  187.     PTR(trunc)[i] = i+403;
  188.   mpf_set (floor, trunc);
  189.   mpf_set (ceil, trunc);
  190.   PTR(ceil)[0]++;
  191.   check_all (src, trunc, ceil, floor);
  192.   /* F.F, carry out of ceil */
  193.   EXP(src) = 1;
  194.   SIZ(src) = 2;
  195.   PTR(src)[0] = GMP_NUMB_MAX;
  196.   PTR(src)[1] = GMP_NUMB_MAX;
  197.   EXP(trunc) = 1;
  198.   SIZ(trunc) = 1;
  199.   PTR(trunc)[0] = GMP_NUMB_MAX;
  200.   mpf_set (floor, trunc);
  201.   EXP(ceil) = 2;
  202.   SIZ(ceil) = 1;
  203.   PTR(ceil)[0] = 1;
  204.   check_all (src, trunc, ceil, floor);
  205.   /* FF.F, carry out of ceil */
  206.   EXP(src) = 2;
  207.   SIZ(src) = 3;
  208.   PTR(src)[0] = GMP_NUMB_MAX;
  209.   PTR(src)[1] = GMP_NUMB_MAX;
  210.   PTR(src)[2] = GMP_NUMB_MAX;
  211.   EXP(trunc) = 2;
  212.   SIZ(trunc) = 2;
  213.   PTR(trunc)[0] = GMP_NUMB_MAX;
  214.   PTR(trunc)[1] = GMP_NUMB_MAX;
  215.   mpf_set (floor, trunc);
  216.   EXP(ceil) = 3;
  217.   SIZ(ceil) = 1;
  218.   PTR(ceil)[0] = 1;
  219.   check_all (src, trunc, ceil, floor);
  220.   mpf_clear (src);
  221.   mpf_clear (trunc);
  222.   mpf_clear (ceil);
  223.   mpf_clear (floor);
  224. }
  225. int
  226. main (void)
  227. {
  228.   tests_start ();
  229.   check_various ();
  230.   tests_end ();
  231.   exit (0);
  232. }