| /* mpfr_tli2 -- test file for dilogarithm function |
| |
| Copyright 2007, 2008, 2009 Free Software Foundation, Inc. |
| Contributed by the Arenaire and Cacao projects, INRIA. |
| |
| The GNU MPFR Library is free software; you can redistribute it and/or modify |
| it under the terms of the GNU Lesser General Public License as published by |
| the Free Software Foundation; either version 2.1 of the License, or (at your |
| option) any later version. |
| |
| The GNU MPFR Library is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
| or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
| License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with the GNU MPFR Library; see the file COPYING.LIB. If not, write to |
| the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
| MA 02110-1301, USA. */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include "mpfr-test.h" |
| |
| #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0) |
| |
| #define TEST_FUNCTION mpfr_li2 |
| #include "tgeneric.c" |
| |
| static void |
| special (void) |
| { |
| mpfr_t x, y; |
| mpfr_init (x); |
| mpfr_init (y); |
| |
| mpfr_set_nan (x); |
| mpfr_li2 (y, x, GMP_RNDN); |
| if (!mpfr_nan_p (y)) |
| { |
| printf ("Error for li2(NaN)\n"); |
| exit (1); |
| } |
| |
| mpfr_set_inf (x, -1); |
| mpfr_li2 (y, x, GMP_RNDN); |
| if (!MPFR_IS_INF (y) || MPFR_IS_POS (y)) |
| { |
| printf ("Error for li2(-Inf)\n"); |
| exit (1); |
| } |
| |
| mpfr_set_inf (x, 1); |
| mpfr_li2 (y, x, GMP_RNDN); |
| if (!MPFR_IS_INF (y) || MPFR_IS_POS (y)) |
| { |
| printf ("Error for li2(+Inf)\n"); |
| exit (1); |
| } |
| |
| mpfr_set_ui (x, 0, GMP_RNDN); |
| mpfr_li2 (y, x, GMP_RNDN); |
| if (!MPFR_IS_ZERO (y) || MPFR_IS_NEG (y)) |
| { |
| printf ("Error for li2(+0)\n"); |
| exit (1); |
| } |
| |
| mpfr_set_ui (x, 0, GMP_RNDN); |
| mpfr_neg (x, x, GMP_RNDN); |
| mpfr_li2 (y, x, GMP_RNDN); |
| if (!MPFR_IS_ZERO (y) || MPFR_IS_POS (y)) |
| { |
| printf ("Error for li2(-0)\n"); |
| exit (1); |
| } |
| |
| mpfr_clear (x); |
| mpfr_clear (y); |
| } |
| |
| static void |
| normal (void) |
| { |
| int inexact; |
| mpfr_t x, y; |
| mpfr_init (x); |
| mpfr_init (y); |
| |
| /* x1 = 2^-3 */ |
| mpfr_set_str (x, "1p-3", 2, GMP_RNDD); |
| mpfr_li2 (x, x, GMP_RNDN); |
| if (mpfr_cmp_str (x, "0x1087a7a9e42141p-55", 16, GMP_RNDN) != 0) |
| { |
| printf ("Error for li2(x1)\n"); |
| exit (1); |
| } |
| |
| /* check MPFR_FAST_COMPUTE_IF_SMALL_INPUT */ |
| mpfr_set_prec (x, 2); |
| mpfr_set_prec (y, 20); |
| mpfr_set_ui_2exp (x, 1, -21, GMP_RNDN); |
| mpfr_li2 (y, x, GMP_RNDN); |
| MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
| |
| mpfr_set_si_2exp (x, -1, -21, GMP_RNDN); |
| mpfr_li2 (y, x, GMP_RNDN); |
| MPFR_ASSERTN(mpfr_cmp (y, x) == 0); |
| |
| /* worst case */ |
| /* x2 = 0x7F18EA6537E00E983196CDDC6EFAC57Fp-129 |
| Li2(x2) = 2^-2 + 2^-6 + 2^-120 */ |
| mpfr_set_prec (x, 128); |
| mpfr_set_str (x, "7F18EA6537E00E983196CDDC6EFAC57Fp-129", 16, GMP_RNDN); |
| |
| /* round to nearest mode and 4 bits of precision, |
| it should be rounded to 2^-2 + 2^-5 and */ |
| mpfr_set_prec (y, 4); |
| inexact = mpfr_li2 (y, x, GMP_RNDN); |
| if (inexact != 1 || mpfr_cmp_str (y, "0.1001p-1", 2, GMP_RNDN) != 0) |
| { |
| printf ("Error for li2(x2, RNDN)\n"); |
| exit (1); |
| } |
| |
| /* round towards zero mode and 5 bits of precision, |
| it should be rounded to 2^-2 + 2^-6 */ |
| mpfr_set_prec (y, 5); |
| inexact = mpfr_li2 (y, x, GMP_RNDZ); |
| if (inexact != -1 || mpfr_cmp_str (y, "0.10001p-1", 2, GMP_RNDN) != 0) |
| { |
| printf ("Error for li2(x2, RNDZ)\n"); |
| exit (1); |
| } |
| |
| /* round away from zero mode and 5 bits of precision, |
| it should be rounded to 2^-2 + 2^-5 */ |
| inexact = mpfr_li2 (y, x, GMP_RNDU); |
| if (inexact != 1 || mpfr_cmp_str (y, "0.10010p-1", 2, GMP_RNDN) != 0) |
| { |
| printf ("Error for li2(x2, RNDU)\n"); |
| exit (1); |
| } |
| |
| mpfr_clear (x); |
| mpfr_clear (y); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| tests_start_mpfr (); |
| |
| special (); |
| |
| normal (); |
| |
| test_generic (2, 100, 2); |
| |
| data_check ("data/li2", mpfr_li2, "mpfr_li2"); |
| |
| tests_end_mpfr (); |
| return 0; |
| } |
| |
| #else |
| |
| int |
| main (void) |
| { |
| printf ("Warning! Test disabled for this MPFR version.\n"); |
| return 0; |
| } |
| |
| #endif |