Home | History | Annotate | Line # | Download | only in tests
thypot.c revision 1.1.1.3
      1      1.1  mrg /* Test file for mpfr_hypot.
      2      1.1  mrg 
      3  1.1.1.3  mrg Copyright 2001-2016 Free Software Foundation, Inc.
      4  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      5      1.1  mrg 
      6      1.1  mrg This file is part of the GNU MPFR Library.
      7      1.1  mrg 
      8      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     11      1.1  mrg option) any later version.
     12      1.1  mrg 
     13      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     14      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     16      1.1  mrg License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     19      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     20      1.1  mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     21      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     22      1.1  mrg 
     23      1.1  mrg #include <stdio.h>
     24      1.1  mrg #include <limits.h>
     25      1.1  mrg #include <stdlib.h>
     26      1.1  mrg 
     27      1.1  mrg #include "mpfr-test.h"
     28      1.1  mrg 
     29      1.1  mrg /* Non-zero when extended exponent range */
     30      1.1  mrg static int ext = 0;
     31      1.1  mrg 
     32      1.1  mrg static void
     33      1.1  mrg special (void)
     34      1.1  mrg {
     35      1.1  mrg   mpfr_t x, y, z;
     36      1.1  mrg 
     37      1.1  mrg   mpfr_init (x);
     38      1.1  mrg   mpfr_init (y);
     39      1.1  mrg   mpfr_init (z);
     40      1.1  mrg 
     41      1.1  mrg   mpfr_set_nan (x);
     42  1.1.1.3  mrg   mpfr_set_ui (y, 0, MPFR_RNDN);
     43  1.1.1.3  mrg   mpfr_hypot (z, x, x, MPFR_RNDN);
     44  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_nan_p (z));
     45      1.1  mrg   mpfr_hypot (z, x, y, MPFR_RNDN);
     46      1.1  mrg   MPFR_ASSERTN(mpfr_nan_p (z));
     47  1.1.1.3  mrg   mpfr_hypot (z, y, x, MPFR_RNDN);
     48  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_nan_p (z));
     49      1.1  mrg 
     50      1.1  mrg   mpfr_set_inf (x, 1);
     51      1.1  mrg   mpfr_set_inf (y, -1);
     52      1.1  mrg   mpfr_hypot (z, x, y, MPFR_RNDN);
     53      1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
     54      1.1  mrg 
     55      1.1  mrg   mpfr_set_inf (x, -1);
     56      1.1  mrg   mpfr_set_nan (y);
     57      1.1  mrg   mpfr_hypot (z, x, y, MPFR_RNDN);
     58      1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
     59      1.1  mrg 
     60      1.1  mrg   mpfr_set_nan (x);
     61      1.1  mrg   mpfr_set_inf (y, -1);
     62      1.1  mrg   mpfr_hypot (z, x, y, MPFR_RNDN);
     63      1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
     64      1.1  mrg 
     65      1.1  mrg   mpfr_clear (x);
     66      1.1  mrg   mpfr_clear (y);
     67      1.1  mrg   mpfr_clear (z);
     68      1.1  mrg }
     69      1.1  mrg 
     70      1.1  mrg static void
     71      1.1  mrg test_large (void)
     72      1.1  mrg {
     73      1.1  mrg   mpfr_t x, y, z, t;
     74      1.1  mrg 
     75      1.1  mrg   mpfr_init (x);
     76      1.1  mrg   mpfr_init (y);
     77      1.1  mrg   mpfr_init (z);
     78      1.1  mrg   mpfr_init (t);
     79      1.1  mrg 
     80      1.1  mrg   mpfr_set_ui (x, 21, MPFR_RNDN);
     81      1.1  mrg   mpfr_set_ui (y, 28, MPFR_RNDN);
     82      1.1  mrg   mpfr_set_ui (z, 35, MPFR_RNDN);
     83      1.1  mrg 
     84      1.1  mrg   mpfr_mul_2ui (x, x, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
     85      1.1  mrg   mpfr_mul_2ui (y, y, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
     86      1.1  mrg   mpfr_mul_2ui (z, z, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
     87      1.1  mrg 
     88      1.1  mrg   mpfr_hypot (t, x, y, MPFR_RNDN);
     89      1.1  mrg   if (mpfr_cmp (z, t))
     90      1.1  mrg     {
     91      1.1  mrg       printf ("Error in test_large: got\n");
     92      1.1  mrg       mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
     93      1.1  mrg       printf ("\ninstead of\n");
     94      1.1  mrg       mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
     95      1.1  mrg       printf ("\n");
     96      1.1  mrg       exit (1);
     97      1.1  mrg     }
     98      1.1  mrg 
     99      1.1  mrg   mpfr_set_prec (x, 53);
    100      1.1  mrg   mpfr_set_prec (t, 53);
    101      1.1  mrg   mpfr_set_prec (y, 53);
    102      1.1  mrg   mpfr_set_str_binary (x, "0.11101100011110000011101000010101010011001101000001100E-1021");
    103      1.1  mrg   mpfr_set_str_binary (y, "0.11111001010011000001110110001101011100001000010010100E-1021");
    104      1.1  mrg   mpfr_hypot (t, x, y, MPFR_RNDN);
    105      1.1  mrg   mpfr_set_str_binary (z, "0.101010111100110111101110111110100110010011001010111E-1020");
    106      1.1  mrg   if (mpfr_cmp (z, t))
    107      1.1  mrg     {
    108      1.1  mrg       printf ("Error in test_large: got\n");
    109      1.1  mrg       mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
    110      1.1  mrg       printf ("\ninstead of\n");
    111      1.1  mrg       mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
    112      1.1  mrg       printf ("\n");
    113      1.1  mrg       exit (1);
    114      1.1  mrg     }
    115      1.1  mrg 
    116      1.1  mrg   mpfr_set_prec (x, 240);
    117      1.1  mrg   mpfr_set_prec (y, 22);
    118      1.1  mrg   mpfr_set_prec (z, 2);
    119      1.1  mrg   mpfr_set_prec (t, 2);
    120      1.1  mrg   mpfr_set_str_binary (x, "0.100111011010010010110100000100000001100010011100110101101111111101011110111011011101010110100101111000111100010100110000100101011110111011100110100110100101110101101100011000001100000001111101110100100100011011011010110111100110010101000111e-7");
    121      1.1  mrg   mpfr_set_str_binary (y, "0.1111000010000011000111E-10");
    122      1.1  mrg   mpfr_hypot (t, x, y, MPFR_RNDN);
    123      1.1  mrg   mpfr_set_str_binary (z, "0.11E-7");
    124      1.1  mrg   if (mpfr_cmp (z, t))
    125      1.1  mrg     {
    126      1.1  mrg       printf ("Error in test_large: got\n");
    127      1.1  mrg       mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
    128      1.1  mrg       printf ("\ninstead of\n");
    129      1.1  mrg       mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
    130      1.1  mrg       printf ("\n");
    131      1.1  mrg       exit (1);
    132      1.1  mrg     }
    133      1.1  mrg 
    134      1.1  mrg   mpfr_clear (x);
    135      1.1  mrg   mpfr_clear (y);
    136      1.1  mrg   mpfr_clear (z);
    137      1.1  mrg   mpfr_clear (t);
    138      1.1  mrg }
    139      1.1  mrg 
    140      1.1  mrg static void
    141      1.1  mrg test_small (void)
    142      1.1  mrg {
    143      1.1  mrg   mpfr_t x, y, z1, z2;
    144      1.1  mrg   int inex1, inex2;
    145      1.1  mrg   unsigned int flags;
    146      1.1  mrg 
    147      1.1  mrg   /* Test hypot(x,x) with x = 2^(emin-1). Result is x * sqrt(2). */
    148      1.1  mrg   mpfr_inits2 (8, x, y, z1, z2, (mpfr_ptr) 0);
    149      1.1  mrg   mpfr_set_si_2exp (x, 1, mpfr_get_emin () - 1, MPFR_RNDN);
    150      1.1  mrg   mpfr_set_si_2exp (y, 1, mpfr_get_emin () - 1, MPFR_RNDN);
    151      1.1  mrg   mpfr_set_ui (z1, 2, MPFR_RNDN);
    152      1.1  mrg   inex1 = mpfr_sqrt (z1, z1, MPFR_RNDN);
    153      1.1  mrg   inex2 = mpfr_mul (z1, z1, x, MPFR_RNDN);
    154      1.1  mrg   MPFR_ASSERTN (inex2 == 0);
    155      1.1  mrg   mpfr_clear_flags ();
    156      1.1  mrg   inex2 = mpfr_hypot (z2, x, y, MPFR_RNDN);
    157      1.1  mrg   flags = __gmpfr_flags;
    158      1.1  mrg   if (mpfr_cmp (z1, z2) != 0)
    159      1.1  mrg     {
    160      1.1  mrg       printf ("Error in test_small%s\nExpected ",
    161      1.1  mrg               ext ? ", extended exponent range" : "");
    162      1.1  mrg       mpfr_out_str (stdout, 2, 0, z1, MPFR_RNDN);
    163      1.1  mrg       printf ("\nGot      ");
    164      1.1  mrg       mpfr_out_str (stdout, 2, 0, z2, MPFR_RNDN);
    165      1.1  mrg       printf ("\n");
    166      1.1  mrg       exit (1);
    167      1.1  mrg     }
    168      1.1  mrg   if (! SAME_SIGN (inex1, inex2))
    169      1.1  mrg     {
    170      1.1  mrg       printf ("Bad ternary value in test_small%s\nExpected %d, got %d\n",
    171      1.1  mrg               ext ? ", extended exponent range" : "", inex1, inex2);
    172      1.1  mrg       exit (1);
    173      1.1  mrg     }
    174      1.1  mrg   if (flags != MPFR_FLAGS_INEXACT)
    175      1.1  mrg     {
    176      1.1  mrg       printf ("Bad flags in test_small%s\nExpected %u, got %u\n",
    177      1.1  mrg               ext ? ", extended exponent range" : "",
    178      1.1  mrg               (unsigned int) MPFR_FLAGS_INEXACT, flags);
    179      1.1  mrg       exit (1);
    180      1.1  mrg     }
    181      1.1  mrg   mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
    182      1.1  mrg }
    183      1.1  mrg 
    184      1.1  mrg static void
    185      1.1  mrg test_large_small (void)
    186      1.1  mrg {
    187      1.1  mrg   mpfr_t x, y, z;
    188      1.1  mrg   int inexact, inex2, r;
    189      1.1  mrg 
    190      1.1  mrg   mpfr_init2 (x, 3);
    191      1.1  mrg   mpfr_init2 (y, 2);
    192      1.1  mrg   mpfr_init2 (z, 2);
    193      1.1  mrg 
    194      1.1  mrg   mpfr_set_ui_2exp (x, 1, mpfr_get_emax () / 2, MPFR_RNDN);
    195      1.1  mrg   mpfr_set_ui_2exp (y, 1, -1, MPFR_RNDN);
    196      1.1  mrg   inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
    197      1.1  mrg   if (inexact >= 0 || mpfr_cmp (x, z))
    198      1.1  mrg     {
    199      1.1  mrg       printf ("Error 1 in test_large_small%s\n",
    200      1.1  mrg               ext ? ", extended exponent range" : "");
    201      1.1  mrg       exit (1);
    202      1.1  mrg     }
    203      1.1  mrg 
    204      1.1  mrg   mpfr_mul_ui (x, x, 5, MPFR_RNDN);
    205      1.1  mrg   inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
    206      1.1  mrg   if (mpfr_cmp (x, z) >= 0)
    207      1.1  mrg     {
    208      1.1  mrg       printf ("Error 2 in test_large_small%s\n",
    209      1.1  mrg               ext ? ", extended exponent range" : "");
    210      1.1  mrg       printf ("x = ");
    211      1.1  mrg       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    212      1.1  mrg       printf ("\n");
    213      1.1  mrg       printf ("y = ");
    214      1.1  mrg       mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
    215      1.1  mrg       printf ("\n");
    216      1.1  mrg       printf ("z = ");
    217      1.1  mrg       mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
    218      1.1  mrg       printf (" (in precision 2) instead of\n    ");
    219      1.1  mrg       mpfr_out_str (stdout, 2, 2, x, MPFR_RNDU);
    220      1.1  mrg       printf ("\n");
    221      1.1  mrg       exit (1);
    222      1.1  mrg     }
    223      1.1  mrg 
    224      1.1  mrg   RND_LOOP(r)
    225      1.1  mrg     {
    226      1.1  mrg       mpfr_set_ui_2exp (x, 1, mpfr_get_emax () - 1, MPFR_RNDN);
    227      1.1  mrg       mpfr_set_ui_2exp (y, 1, mpfr_get_emin (), MPFR_RNDN);
    228      1.1  mrg       inexact = mpfr_hypot (z, x, y, (mpfr_rnd_t) r);
    229      1.1  mrg       inex2 = mpfr_add_ui (y, x, 1, (mpfr_rnd_t) r);
    230      1.1  mrg       if (! mpfr_equal_p (y, z) || ! SAME_SIGN (inexact, inex2))
    231      1.1  mrg         {
    232      1.1  mrg           printf ("Error 3 in test_large_small, %s%s\n",
    233      1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r),
    234      1.1  mrg                   ext ? ", extended exponent range" : "");
    235      1.1  mrg           printf ("Expected ");
    236      1.1  mrg           mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
    237      1.1  mrg           printf (", inex = %d\n", inex2);
    238      1.1  mrg           printf ("Got      ");
    239      1.1  mrg           mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
    240      1.1  mrg           printf (", inex = %d\n", inexact);
    241      1.1  mrg           exit (1);
    242      1.1  mrg         }
    243      1.1  mrg     }
    244      1.1  mrg 
    245      1.1  mrg   mpfr_clear (x);
    246      1.1  mrg   mpfr_clear (y);
    247      1.1  mrg   mpfr_clear (z);
    248      1.1  mrg }
    249      1.1  mrg 
    250      1.1  mrg static void
    251      1.1  mrg check_overflow (void)
    252      1.1  mrg {
    253      1.1  mrg   mpfr_t x, y;
    254      1.1  mrg   int inex, r;
    255      1.1  mrg 
    256      1.1  mrg   mpfr_inits2 (8, x, y, (mpfr_ptr) 0);
    257      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    258      1.1  mrg   mpfr_setmax (x, mpfr_get_emax ());
    259      1.1  mrg 
    260      1.1  mrg   RND_LOOP(r)
    261      1.1  mrg     {
    262      1.1  mrg       mpfr_clear_overflow ();
    263      1.1  mrg       inex = mpfr_hypot (y, x, x, (mpfr_rnd_t) r);
    264      1.1  mrg       if (!mpfr_overflow_p ())
    265      1.1  mrg         {
    266      1.1  mrg           printf ("No overflow in check_overflow for %s%s\n",
    267      1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r),
    268      1.1  mrg                   ext ? ", extended exponent range" : "");
    269      1.1  mrg           exit (1);
    270      1.1  mrg         }
    271      1.1  mrg       MPFR_ASSERTN (MPFR_IS_POS (y));
    272      1.1  mrg       if (r == MPFR_RNDZ || r == MPFR_RNDD)
    273      1.1  mrg         {
    274      1.1  mrg           MPFR_ASSERTN (inex < 0);
    275      1.1  mrg           MPFR_ASSERTN (!mpfr_inf_p (y));
    276      1.1  mrg           mpfr_nexttoinf (y);
    277      1.1  mrg         }
    278      1.1  mrg       else
    279      1.1  mrg         {
    280      1.1  mrg           MPFR_ASSERTN (inex > 0);
    281      1.1  mrg         }
    282      1.1  mrg       MPFR_ASSERTN (mpfr_inf_p (y));
    283      1.1  mrg     }
    284      1.1  mrg 
    285      1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
    286      1.1  mrg }
    287      1.1  mrg 
    288      1.1  mrg #define TWO_ARGS
    289      1.1  mrg #define TEST_FUNCTION mpfr_hypot
    290      1.1  mrg #include "tgeneric.c"
    291      1.1  mrg 
    292      1.1  mrg static void
    293      1.1  mrg alltst (void)
    294      1.1  mrg {
    295      1.1  mrg   mpfr_exp_t emin, emax;
    296      1.1  mrg 
    297      1.1  mrg   ext = 0;
    298      1.1  mrg   test_small ();
    299      1.1  mrg   test_large_small ();
    300      1.1  mrg   check_overflow ();
    301      1.1  mrg 
    302      1.1  mrg   emin = mpfr_get_emin ();
    303      1.1  mrg   emax = mpfr_get_emax ();
    304      1.1  mrg   set_emin (MPFR_EMIN_MIN);
    305      1.1  mrg   set_emax (MPFR_EMAX_MAX);
    306      1.1  mrg   if (mpfr_get_emin () != emin || mpfr_get_emax () != emax)
    307      1.1  mrg     {
    308      1.1  mrg       ext = 1;
    309      1.1  mrg       test_small ();
    310      1.1  mrg       test_large_small ();
    311      1.1  mrg       check_overflow ();
    312      1.1  mrg       set_emin (emin);
    313      1.1  mrg       set_emax (emax);
    314      1.1  mrg     }
    315      1.1  mrg }
    316      1.1  mrg 
    317      1.1  mrg int
    318      1.1  mrg main (int argc, char *argv[])
    319      1.1  mrg {
    320      1.1  mrg   tests_start_mpfr ();
    321      1.1  mrg 
    322      1.1  mrg   special ();
    323      1.1  mrg 
    324      1.1  mrg   test_large ();
    325      1.1  mrg   alltst ();
    326      1.1  mrg 
    327      1.1  mrg   test_generic (2, 100, 10);
    328      1.1  mrg 
    329      1.1  mrg   tests_end_mpfr ();
    330      1.1  mrg   return 0;
    331      1.1  mrg }
    332